• Есть ли способ добавить свои методы не трогая модель в laravel?

    RNSNS
    @RNSNS
    Symfony Backend developer
    На самом деле это очень легко

    #src/Model/ProductProxy.php
    <?php
    
    namespace App\Model;
    
    use ВашПакет\Product;
    
    class ProductProxy extends Product
    {
        public function newMethod(): void
        {
            echo "Hello World!";
        }
    }
    Ответ написан
    Комментировать
  • Как правильно назвать pivot-таблицу при отношении многие ко многим в laravel?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    Правильный, с точки зрения ларавел, вариант указан в документации, которую ты почему-то не стал читать.
    Ответ написан
    7 комментариев
  • Почему спидтест дает 100mbit/s а bittorrent 1.3?

    @rPman
    Спидтест нужно смотреть, выбрав другую страну.
    Торенты - одни из самых нестабильных (слабо прогнозируемых) методов проверки скорости.

    Но главное - в подавляющем большинстве случаев интернет можно поделить на три зоны - твой город/область, страна, мир. Скорость до узлов (сидов загружаемого торента) в этих зонах отличается с понижением, самая быстрая (обычно 100мбит или максимум от провайдера) это город/область, заметно медленнее - несколько десятков мегабит это страна, и считанные мегабиты - мир.

    Если твои сиды (хотя бы один из них) попадает в зону твоего города или твоего провайдера, то скорость будет максимальной, иначе будет ограничена скоростью до зоны (вне зависимости от количества сидов в этой зоне, чаще всего).

    Само собой все сложнее, есть еще личные ограничения сидеров, текущая нагрузка на линиях между провайдерами и куча других условий, но чаще выглядит все как сказано выше.
    Ответ написан
    Комментировать
  • Как оптимизировать reduce?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Массив дат можно вынести наружу, что
    1) не будет пересоздавать переменную каждый раз.
    2) сделает решение более гибким
    let a =  [
       {
          "code":"CL",
          "tnved10":"7318158100",
          "2019":"33",
          "2020":"0.00",
          "2021":"0.00"
       },
       {
          "code":"CN",
          "tnved10":"7318158100",
          "2019":"7540001.66",
          "2020":"8164813.34",
          "2021":"20980774.64"
       }]
    let b = a.reduce((acc, current) => {
      [2019, 2020, 2021].forEach(i => acc[i] += Number(current[i]))
      return acc
    }, {'2019': 0, '2020': 0, '2021': 0});
    console.log(b)


    Типа так:
    const years = [2019, 2020, 2021]
    let b = a.reduce((acc, current) => {
      years.forEach(i => acc[i] += Number(current[i]))
      return acc
    }, {'2019': 0, '2020': 0, '2021': 0});


    Можно ещё сократить, но уже в ущерб читаемости.
    Или можно убрать инициализацию начального значения аккумулятора, перенеся проверку ключа на то, что это год внутрь. Правда это несколько увеличит код внутри reduce, но сделает более гибким код.
    Ответ написан
    Комментировать
  • Как вызывать динамический метод класса как статический в PHP?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Тебе нравится концепция ларавельных фасадов, которые публичные методы статически вызывают.

    В самой ларе по инструкции можешь сделать свой фасад и привязать к нему класс, который будет делать всю работу. Это простейший способ. Под капотом идея в том, чтобы создать твой класс в начале программы, положить его в контейнер, и всегда когда ты статически вызываешь методы - класс созданный дергается из контейнера, где он лежит, и на нем вызывается. Надеюсь ты понимаешь, что не всегда можно использовать один и тот же экземпляр во всей программе. Например для тех же моделей, где важен "текущий", а не "всегда один", как в синглтоне.

    Способ ООПшный - это сделать второй класс куда скопировать все методы, но тело сделать так, чтобы в каждом методе вызывался "сиглтон" или брался класс из контейнера. Или так как Сергей delphinpro описал, тело не копируешь, но делаешь магию, в итоге один класс у тебя с пабликами, а второй вызывает через статики, но класса все равно в итоге два. В ларе тоже. Фасад у них обертка для исполнителя, а не сам исполнитель.

    Причина (но не проблема) этого - отсутствие в пхп понятия "перегрузка метода" которое позволяет в одном классе написать один и тот же метод 3-4 раза указав разный набор параметров и по числу переданных параметров будет выбрано что это есть. Это штука конечно модная, но хорошо, что её нет. Когда она есть код будет более странным и непредсказуемым при беглом чтении. В пхп решили это не делать. Вернее как сказать - понятие ввели, как написал Сергей delphinpro, но реализация идет через 4 разных метода, которые ты потом с помощью if() вручную определяешь.

    У меня так в библиотеке сделаны модули, я специально писал генератор фасадов, потому что у меня 20 классов, во всех методов около 10, и надо чтоб хочешь - фасадом как в ларе, хочешь иньекцией зависимости как предполагает паттерн инжектор, хочешь трейтом можно было подключать когда лень и побыстрому, хочешь - aware интерфейсом через сеттер как в симфони прямо контейнером. https://github.com/6562680/support

    Но "ООПшным" способом - это если хочеться разобраться "как". Если хочется решить проблему - бери статью о фасадах в ларе и делай по ней.

    Ещё одна деталь. Если ты будешь сильно увлекаться фасадами ты сделаешь код, который невозможно поддерживать. Понимаешь, статический вызов "хардкодит" в код функции имя класса, который её выполняет. Что делает невозможным будущую подмену без наследования, а наследование там где не нужно - это не к добру.

    Судя по твоему примеру с моделью ты пытаешься дать модели некое действие, потому что так подразумевает логика твоей программы, то есть ты условно хочешь научить модель Юзер создавать или там менять как-то другого/несколько/всех юзеров. Поздравляю, ты подошел к понятию "агрегата", который в книгах много где встречается. Но это слово упрощается до слова "класс-сервис", когда ты свой метод создаешь не в модели Юзер, а в другом классе, называешь его UserService, и потом его на входе конструктора ожидаешь, и он туда будет подброшен, и не надо будет статикой ничего делать.

    Но да, есть и тут подводный камень. Когда хочешь изнутри модели в методе вызвать, там же конструктор уже занят $attributes, надо наследовать, а потом создавать модельки уже не через new, а через контейнер, чтобы подбрасывалось - но это боль. Поэтому перейди к работе с классами сервисами. Если ты хочешь поменять модель - ты свою модель передаешь в метод сервиса параметром, где сервис над моделью делает действие и выдает измененную.
    Ответ написан
    4 комментария
  • Как в laravel построить сложную логику?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Бизнес-логике - не место в контроллере.

    AppServiceProvider
    public function boot(){
    Validator::extend('count_books', function($attribute, $value, $parameters) {
            $count = IssueBook::where('client_id', $value)->where('is_returned', false)->count()
            return $count < 2;
    });
    }
    
    StoreRequest
    public function rules()
      {
        return [
          'category_id' => 'exists:App\Category,id',
          'client_id' => 'exists:App\Client,id|count_books',
          'book_id' => 'exists:App\Book,id',
          'days_issued' => 'nullable|string',
          'is_returned' => 'nullable|boolean',
          'return_date' => 'nullable|date',
        ];
      }
    Ответ написан
  • Как улучшить код, который проверяет наличие элемента в массиве и его значение?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Тут вопрос не столько в сокращении сколько в осмысленности.

    И ответ зависит от двух вводных, которые мы не знаем:
    1. по какой причине элемент 'test' может отсутствовать
    2. какие ещё значения могут быть у $arr['test']

    Если совсем всё равно на всё и пишем говнокод-стайл лишь бы покороче, то, как правильно написано в соседнем ответе - empty().

    Если элемент обязательно должен присутствовать, то либо убираем проверку на isset совсем, либо - если это интерактивное приложение - выносим отдельно, и при отсутствии элемента сообщаем об ошибке. Пусть даже и тупо 400 кодом.

    Если у $arr['test'] не могут быть другие значения, кроме true, то тоже проверить, и выбросить ошибку, если значение какое-то другое.
    Ответ написан
    Комментировать
  • Как найти 3 одинаковых числа, идущих подряд в массиве js?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    Задания запрещены правилами.
    Вариантов решений куча.
    Например, можно использовать счётчик совпадений. Надо хранить предыдущее значение и сравнивать его с текущим. Если они равны, то счётчик увеличить, иначе сбросить.
    Если счётчик равен 3, то выход true
    Ответ написан
    Комментировать
  • Как найти 3 одинаковых числа, идущих подряд в массиве js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    для первой версии решения учебного задания можно и «на пальцах»:
    сравнивать с двумя предыдущими
    const has3 = arr => {
      for (let i = 2; i < arr.length; i++) {
        if (arr[i] === arr[i - 1] && arr[i] === arr[i - 2]) {
          return true;
        }
      }
      return false;
    }
    
    has3([1,2,3,3,4,5,5,5,6]) // true
    has3([1,2,3,3,4,5,5,6,6]) // false


    Подумайте, как можно сделать решение более универсальным, чтобы задавать параметром необходимое число идущих подряд, которое ищем.
    Ответ написан
    9 комментариев
  • Как использовать сессию для всех клиентов одновременно?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Единственно правильный ответ - никак.

    Такой вопрос можно задать только от безграмотности. От непонимания того, как работают сессии.
    Потому что сессия в обязательном порядке блокирует файл с данными на время работы с ним. И именно отсюда возникают многочисленные вопросы "а почему у меня долгий процесс в одной вкладке блокирует сайт во всех остальных вкладках?". А теперь представим, что один и тот же файл блокирует не один юзер, а все по очереди. Таймаут будет постепенно накапливаться, и в итоге сайт у всех пользователей сначала начнет ощутимо подтормаживать, а потом и вовсе встанет колом.
    Поэтому такая вещь, как "сессия сразу для всех пользователей" заведомо является бессмыслицей.

    Если под "сессией" имелось в виду общее хранилище для всех пользователей, то оно называется "база данных". И в этом смысле "БД не предлагать" выглядит беспочвенным капризом. Как правильно заметил N в комментарии, такое заявление звучит как "Как кушать суп? Ложку не предлагать."
    Такие заявления надо всегда подробно обосновывать. И в этом случае вам либо действительно подскажут, как обойтись без БД, либо объяснят, что это просто блажь.

    Если хранилище не нужно, то есть значение переменной не меняется со временем, то, как правильно сказано в соседнем ответе, просто делается константа в конфигурационном файле, который по умолчанию включается во все скрипты.
    Ответ написан
    Комментировать
  • Почему выдает ошибку #1050 - Table 'users' already exists?

    paran0id
    @paran0id
    Умный, но ленивый
    CREATE TABLE IF NOT EXISTS users (
    Ответ написан
    Комментировать
  • Как написать такой SQL запрос?

    rozhnev
    @rozhnev Куратор тега SQL
    Fullstack programmer, DBA, медленно, дорого
    select d.DEPARTMENT_ID, d.DEPARTMENT_NAME, COUNT(e.EMPLOYEE_ID)
    from departments d
    left join employees e on d.DEPARTMENT_ID = e.DEPARTMENT_ID
    group by d.DEPARTMENT_ID, d.DEPARTMENT_NAME;


    SQL online editor
    Ответ написан
    Комментировать
  • Как написать такой SQL запрос?

    iMedved2009
    @iMedved2009
    Не люблю людей
    select 
      departments.id, 
      departments.department, 
      count(*) as count 
    from departments 
    join employees on employees.department_id = departments.id 
    group by departments.id, departments.name;


    В случае если нам нужны департаменты у которых нет сотрудников inner join меняем на left join

    select 
      departments.id, 
      departments.department, 
      count(*) as count 
    from departments 
    left join employees on employees.department_id = departments.id 
    group by departments.id, departments.name;
    Ответ написан
    4 комментария
  • Как сравнить по времени в таблицах, отбросив минуты и секунды до часов?

    @alexalexes
    Select t1.ID, t1.TIME
    from 
    TABLE_1 t1 
    JOIN TABLE_2 t2 ON t1.ID=t2.ID
                  and to_char(t1.TIME, 'DD.MM.YYYY HH24') = to_char(t2.TIME, 'DD.MM.YYYY HH24')

    Вариант 2 (возможно, пригодится при оптимизации, так как на выходе сравниваются значения в типе дата время, а не строк):
    ... and trunc(t1.TIME, 'hh24') = trunc(t2.TIME, 'hh24')

    PS: Хорошо бы еще индекс создать под этот формат времени для колонок t1.TIME и t2.TIME, тогда запрос будет всегда производителен.
    Ответ написан
    4 комментария
  • Как отсеять сгенерированные email?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    2yiwuei3827ryifg2i28ftiwegfi@yandex.ru или такие vladimir_saveliev_98@mail.ru, natalia_blohina_93@list.ru
    А с чего вдруг их не принимать? Они валидны и соответствуют RFC. Какой смысл их удалять? Или точнее, какой смысл удалять работающие емайлы? Вам не пофиг как выглядит емайл, если он рабочий? Или есть какой-то особый смысл в красивых емайлах?
    Ответ написан
    4 комментария
  • Как отсеять сгенерированные email?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Это не возможно сделать по адресу, потому что адрес chtoetozahren@gmail.com может оказаться реальным а адрес john.lennon@beatles.com быть генерированным.
    Единственный вариант отправлять на этот адрес и если нет подтверждения в течении Х дней удалять
    Ответ написан
    2 комментария
  • Народ, как использовать редис на 2 проекта?

    GigaLORDex
    @GigaLORDex
    Бизнес-Системный аналитик
    Как вариант - префикс.
    Ответ написан
    Комментировать
  • Как объединить данные в двумерном массиве?

    0xD34F
    @0xD34F
    $grouped = array_values(array_reduce($arr, function($acc, $n) {
      $acc[$n[0]] ??= [ $n[0] ];
      array_push($acc[$n[0]], ...array_slice($n, 1));
      return $acc;
    }, []));
    Ответ написан
    Комментировать
  • Почему PHP используется в не HighLoad приложениях?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Этот один человек профан и глупец, а PHP простой в изучении и использовании язык, который применяется в проектах с любым уровнем нагрузок.
    Ответ написан
    2 комментария
  • Как усложнить жизнь провайдеру не теряя комфорта?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Тут надо учитывать, что сам факт использования шифрованного канала легко задетектить. VPN маскируется под повседневную бытовую активность, а значит понять,ч то человек что-то скрывает легко.
    Представьте человека, идущего летним вечером по улице в темном плаще, шляпе, тёмных очках и накладных усах. Его станут проверять первым.
    Если вы действительно совершаете какую-то незаконную или компрометирующую деятельность, то делать это просто через VPN или TOR - решение частичное и ни от чего не убережет.
    Отсутствие обычной бытовой сетевой активности -это тоже сигнал и признак того, что вы "в накладных усах и шляпе".
    Настоящие параноики не должны вести себя как параноики, это из выделяет из общей массы. Настоящие параноики живут жизнью с двойным и тройным дном, сам факт наличия которых (днищ? как еще во множественном числе сказать?) доказать проблематично. Однако неосторжностью проюить такое дно легче легкого.

    Очевидно, что готовых решений тут быть не может, иначе они станут очередным паттерном. Но хорошие направления вам уже посоветовали.
    Можно завести отдельный роутер, который будет подключаться через свой VPN на зарубежном VPS.
    Вся каждодневная бытовая активность у вас через обычный открытый канал. Второй роутер можно юзать только для сёрфинга по запрещеным нынче инстаграммам и прочим фейспукам (официально). Для остального (неофициально) нужно придумывать кастомные стеганографические каналы передачи сигналов. Кастомные каналы пока что отслеживать проблематично.
    Ну и да, обсуждать вот так вот в сети особенности и способы организации кастомных каналов довольно глупо. Это надо делать на шашлыках лично=)
    Ответ написан
    Комментировать