Я пытаюсь получить список массивов идентификаторов для передачи другому модельному запросу.
$companies = $user->companies->pluck('id');
Но он продолжает возвращать ассоциативный массив как таковой:
[ 0 => 2, 1 => 9]
Поэтому, когда я передаю его методу find в моей модели компании, например,
$company = Company::find($companies);
Я получаю следующую ошибку:
Trying to get property of non-object
Мне нужно передать неассоциативный массив вызову, например:
Company::find([2,9]);
3 ответа
Как вы можете видеть в исходном коде Laravel
SRC / Освещение / База данных / Красноречие / Builder.php
public function find($id, $columns = ['*'])
{
if (is_array($id)) {
return $this->findMany($id, $columns);
}
$this->query->where($this->model->getQualifiedKeyName(), '=', $id);
return $this->first($columns);
}
find()
будет внутренне вызывать findMany()
, если первый параметр является массивом. Но $user->companies->pluck('id')
возвращает Collection
, а Builder
создает неправильный запрос. Итак, ваши варианты:
Используйте findMany()
:
$company = Company::findMany($companies);
Преобразуйте коллекцию в массив:
$company = Company::find($companies->toArray());
Используйте whereIn()
:
$company = Company::whereIn('id', $companies)->get();
Но на самом деле все это кажется бессмысленным, потому что $user->companies
, вероятно, уже содержит коллекцию, которую вы хотите получить из БД. Так что вы также можете написать:
$company = $user->companies;
Однако тот факт, что вы используете единичное именование (компания) для группы компаний, позволяет мне думать, что вы пытаетесь достичь чего-то совершенно другого.
Попробуй это:
$companies = $user->companies->pluck('id')->toArray();
Только что сделал тест в tinker и в результате получился плоский массив, "найти" точно сработает!
Вы можете попробовать с помощью метода whereIn
Company::whereIn('id', $companies)->get();
Похожие вопросы
Новые вопросы
laravel
Платформа Laravel — это веб-инфраструктура PHP с открытым исходным кодом, которая позволяет разработчикам создавать динамические и масштабируемые веб-приложения. Исходный код Laravel размещен на GitHub и выпущен под лицензией MIT.