Я пытаюсь получить список массивов идентификаторов для передачи другому модельному запросу.

$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]);
1
Miura-shi 7 Сен 2016 в 19:23

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;

Однако тот факт, что вы используете единичное именование (компания) для группы компаний, позволяет мне думать, что вы пытаетесь достичь чего-то совершенно другого.

1
Paul Spiegel 7 Сен 2016 в 21:07

Попробуй это:

$companies = $user->companies->pluck('id')->toArray();

Только что сделал тест в tinker и в результате получился плоский массив, "найти" точно сработает!

2
Rocco Milluzzo 7 Сен 2016 в 19:38

Вы можете попробовать с помощью метода whereIn

Company::whereIn('id', $companies)->get();

0
Sylwit 7 Сен 2016 в 16:29