Кто сталкивался с такой странностью laravel? Как объяснить?

Ситуация такая - если делать запрос таким образом
\Model\Ad::whereStatus(1)->whereIn("category_id", $this->data['categories']->map->only(['id']))->get();


то все достаточно быстро отрабатывается, но если вот так

\Model\Ad::whereStatus(1)->whereIn("category_id", $this->data['categories'])->get();


то запрос растягивается на 5-6 секунд. Фактически, разницы в том, что в первом случае я уже готовые айдишки передаю, во втором случае коллекцию с этими айдишниками. Но ведь коллекция - это их ларавеловский тип данных, почему такая фигня-то?
  • Вопрос задан
  • 302 просмотра
Решения вопроса 1
gzhegow
@gzhegow
Думал, стану умнее, когда адаптируюсь, но нет
Может я не ас, но
$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()); и смотришь.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы