Ответы пользователя по тегу Laravel
  • Laravel. Как тестировать кэширование?

    @MadridianFox
    Web-программист, многостаночник
    Многие фасады в ларавеле позволяют получить мок или задавать ожидания прямо через фасад.
    В документации пример как раз с кешем.
    https://laravel.com/docs/10.x/mocking#mocking-facades
    Ответ написан
    Комментировать
  • Как сделать выбор языка в Laravel?

    @MadridianFox
    Web-программист, многостаночник
    Я бы не пытался поддерживать пути с языком и без.
    Думаю достаточно / редиректитить на /ru, как это делает тот же habr.com например, а все остальные ссылки всегда делать с языком.
    Т.е. /ru/posts/1 это нормально, а /posts/1 это уже ошибка.

    Далее, я бы все, вообще все роуты обернул бы в группу
    Route::prefix('{lang}')->group(function () {
      //...
    });


    После этого я бы написал middleware, который берёт из запроса код языка, и выставляет локаль.

    А ещё, т.к. язык это параметр в path, то для нусущетсвующего языка надо отдавать код 404, а не 400.
    Ответ написан
    Комментировать
  • Как получить уникальные записи из БД?

    @MadridianFox
    Web-программист, многостаночник
    Чтобы sql запрос выдал вам только уникальные строки необходимо в секцию select добавить слово distinct.
    Вот так:
    select distinct id, name, date...
    Примерно то же самое можно сделать и через eloquent builder
    Model::query()->distinct()...

    Однако это работает именно со строками ответа.
    Если же у вас строки ответа разные, но дата повторяется, то там нужно более сложное решение.
    Ответ написан
    2 комментария
  • Как ускорить обработку запроса к бд?

    @MadridianFox
    Web-программист, многостаночник
    Что касается производительности, то вы столкнулись с проблемой N+1 запроса.
    Это когда вам надо получить список записей и для каждой из них вы делаете дополнительный запрос к БД. 900 записей? Ок, будет первый запрос + ещё 900, по одному на каждую запись.
    Быстрее может быть выполнить всего два запроса. Первый берёт записи, а второй берёт все дополнительные данные сразу для всех записей и потом уже на стороне php вы в цикле засовываете данные в каждую запись.
    Вот абстрактный пример:
    $shops = query("Select * from shop where city='Moscow'");
    $shops = indexBy("id",$shops);
    $employes = query("Select * from employe join shop on(shop.id = employe.id_shop) where shop.city='Moscow'");
    foreach($employes as $eml){
        $shops[$emp["id_shop"]]["employes"][] = $emp;
    }
    Ответ написан
    1 комментарий
  • Как подключать классы в рантайме в PHP?

    @MadridianFox
    Web-программист, многостаночник
    Как уже написал Stalker_RED, класс не обязательно юзать. Можно просто обратиться к нему по полному имени. Полное имя класса - это неймспейс + имя класса.
    Т.к. вы будете создавать объект класса на основании каких-то данных, то рано или поздно всё сведётся к тому, что вы запишете полное имя класса как строку в переменную и потом используете эту переменную для создания объекта.
    function makeObject($class_name){
        $full_class_name = "\\app\\some_strategy\\" . $class_name;
        return new $full_class_name();
    }

    Кроме того, Melkij упомянул паттерн проектирования, который используется как раз для инкапсуляции логики создания объекта на основании каких-то данных. В зависимости от предметной области, и того, как создание таких объектов в неё укладывается, есть смысл рассмотреть такие паттерны как Factory Method и Abstract Factory.
    Ответ написан
    Комментировать
  • Как сконструировать запрос, при котором leftJoin должен брать имя второй таблицы из ячейки первой?

    @MadridianFox
    Web-программист, многостаночник
    Сомневаюсь что вообще возможно в одном запросе использовать данные, хранимые в таблице, в качестве названия объектов БД.

    Скорее всего придётся делать дополнительные запросы, в иделае - по одному на каждую таблицу товара.

    А вообще такие вещи как товары, следует хранить используя EAV структуру.
    Ответ написан
    Комментировать