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

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

    Ресурс это считай array_map();
    Метод collection() это просто array_map() для array_map()

    Пытаясь сделать ресурс для юзера, делаешь внутри ресурс для специальности, которая потом обратно делает ресурс для юзера.

    Это сломалось потому что у тебя есть связь в обе стороны и получается замкнутый круг (он еще граф называется). Тебе надо из графа дверь сделать, признак по которому твой маппер понимает что там он уже был

    Кроме того маааленький сюрприз - у тебя идет обращение к связанной модели, а поскольку скорее всего ты до этого не сделал with('specialitiesResource') то оно у тебя еще и запрос к базе в рекурсии делает

    И второй сюрприз, еще поменьше, когда ты маппишь коллекцию юзеров, то он для каждого юзера делает запрос в базу для каждой специальности. Дважды n+1 query в рекурсии
    Ответ написан
  • Кто сталкивался с такой странностью laravel? Как объяснить?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Может я не ас, но
    $this->data['categories']->map->only(['id'])

    1. map это метод... разве их можно обратиться к методу как к свойству в ларе? А если у тебя есть свойство `map` то будь осторожен, в ларе есть такой метод, а внутри там под капотом чуть ли не сравнение property_exists() method_exists() и всё на магии, можешь ухреначить свою модель и будет вопрос "как она вообще работает" а не "почему она неправильно работает"

    2. only это для выборки если ты из массива сделал коллекцию
    collect([ 'name' => 'vasia', 'age' => 30 ])->only('name'); // [ 'name' => 'vasia' ];
    Roles::get()->only(['id' => 1]); // object Roles#1 (id => 1, title = ...)

    3. чтобы взять список айдишников надо
    $categories->pluck('id')->all(); // [1,2,3]

    По поводу растягивания на 5-6 секунд - видишь ли у лары внутри очень много магии. Вероятно она или ищет, или пытается сделать toString() который там под капотом какой-нибудь serialize() вызывает. В общем говоря оно то работает, но запрос там получится из лютой дичи, WHERE id IN ({json}, {json}) и еще какой-то херни понаделает

    Дебажить запросы var_dump($query->toSql(), $query->getBindings()); и смотришь.
    Ответ написан
    1 комментарий
  • Как вывести все отношения таблиц в laravel?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    $projects = Project::with('roles'); // сформировать запрос на проекты и заготовить запрос на роли. Запрос на проекты при запуске выполнит еще и второй.
    foreach ($projects as $project) {
    $roles = $project->roles; // модели ролей по данному проекту
    }

    $project = new Project(); // создать новую модель ИЛИ
    $project = Project()::first(); // выбрать первую модель из базы

    $query = $project->roles(); // сформировать запрос, который потом нужно выполнить. В качестве WHERE id= будет использован $project->id; Если его там не было - бесполезный запрос, который ссуко все равно будет отправлен на сервер базы данных
    $query->get(); // список ролей или пустая коллекция

    $project->roles; // сразу список ролей (он еще и запросит если не был запрошен через with())

    Будь внимателен, под капотом сделается запрос на роли, если ты его не сделал через with('roles'). Если ты это напишешь в каком-нибудь геттере типа так
    public function getMyAttribute() { return $this->roles; }

    то ты познакомишься с "n+1 проблемой", это когда для сотни проектов будет выполнено 100 запросов на роли.
    Ответ написан
    Комментировать
  • Что такое find(), find(1) в laravel?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    В базе каждая запись имеет личный номер (как выше пишут - первичный ключ), обычно (id), реже какой-то специфичное поле.

    Команда find() - это команда запроса в базу.
    Если ей передать единственный параметр, Ларавель предположит, что это первичный ключ и выдаст тебе запись с таким ключом.
    Ответ написан
    Комментировать