Задать вопрос
Ответы пользователя по тегу Laravel
  • Как получить id страницы до ее создания в Ларавель?

    @MadridianFox
    Web-программист, многостаночник
    При сохранении модели в БД, фреймворк автоматически получает её id, и он становится доступным через одноимённое поле.
    Как уже писали выше, делает это вот так
    $myModel->save();
    echo $myModel->id;

    Когда вам нужно записать данные в связанные таблицы, то вам определённо нужено делать это последовательно.
    Вы не можете сначала сохранить строку в связанную таблицу с вымышленным id, а потом сохранить модель в первую таблицу с этим id - проверка целостности не позволит использовать несуществующий foreign key.
    Поэтому код сохранения нескольких связанных записей нужно свести к
    $myModel->save();
    
    $relatedModel = new RelatedModel();
    $relatedModel->my_model_id = $myModel->id;
    
    $relatedModel->save();


    Если вдруг, как-то так получилось, что как-то невообразимым образом при сохранении первой модели нужно знать id второй модели, а при созранении второй - id первой, то у вас проблема - схема БД и логика приложения неправильные.
    Если это какое-то легаси, не ваше, которое нельзя исправить и просто надо как-то доработать, ну тогда поверх одних неправильных решений придётся делать свои осознанно "неправильные" решения, например отказываться от FK на поле, делать его nullable, разбивать сохранение записи на несколько этапов - сначала все данные без id связи, потом отдельно id связи после того как она сама будет создана в БД.
    Ну это так, мысли вслух про странные случаи.

    И опять же, как уже писали, для правильно реализованных моделей есть функции-хелперы, упрощающие связывание моделей
    $myModel->save();
    $myModel->relatedModels()->attach($relatedModel);
    Ответ написан
    Комментировать
  • 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 структуру.
    Ответ написан
    Комментировать