Laravel Eloquent с и найти

Почему это не работает?

Article::with('category')->find($ids)

У меня есть исключение преобразования массива в строку.

Но если я разделю запрос на 2 части, например:

$articles = Article::with('category')

а также

$articles = $articles->find($ids)

У меня не было никаких исключений, и результат правильный.


person Marco    schedule 31.05.2013    source источник
comment
Можете ли вы вставить трассировку стека массива в исключение преобразования строки? Насколько я помню, то, что вы опубликовали первым, должно работать. Изменить: убедитесь, что $ids - это единственный идентификатор, а не массив идентификаторов. Если вы хотите найти статьи, в которых идентификатор находится в массиве, используйте where_in('id', $ids)->get().   -  person Jason Lewis    schedule 01.06.2013
comment
Это объяснило мне это: stackoverflow.com/questions/34617150/   -  person Ryan    schedule 05.02.2019


Ответы (4)


Только для потомков ... Другой способ сделать это:

Article::with('category')->whereIn('id', $ids)->get();

Это должно быть быстрее, потому что он оставляет запрос менеджеру базы данных.

person dani24    schedule 14.12.2015
comment
Другой ответ, представленный Адамом, который уже был опубликован тремя месяцами ранее, делает то же самое. Порядок вызовов with и whereIn не имеет значения. Оба ответа одинаково хороши. - person orrd; 06.01.2017
comment
Спасибо, Орд, я действительно удивился, почему мою не приняли. Теперь в L5 стало еще проще. Статья :: with ('категория') - ›find ($ ids); - person Adam; 02.02.2017
comment
Я лучше буду использовать ->first(); вместо ->get();. Первый вернет ожидаемую статью, а второй - коллекцию. - person Enrique Bermúdez; 08.12.2018
comment
Если вы видите вопрос, он хотел получить $articles, где идентификатор принадлежит $ids. Он не хотел получать ни одной статьи - person dani24; 09.12.2018
comment
Я получаю сообщение об ошибке Allowed memory size of 268435456 bytes exhausted - person Noah Gary; 13.03.2019
comment
@NoahThomasGary Сколько у вас идентификаторов? Модель, которую вы загружаете, содержит много данных? - person dani24; 14.03.2019

Пытаться:

Article::with('category')->get()->find($ids);

Я полагаю, вам нужно получить статьи, прежде чем вы сможете вызвать find ().

Предупреждение. Это извлекает каждую статью из базы данных и загружает их все в память, а затем выбирает только одну из всех этих данных и возвращает ее. Вероятно, вы не хотели бы решать эту проблему так.

person Rob W    schedule 31.05.2013
comment
Нет, это не работает. У меня не было никаких исключений, но красноречивые использовали только один идентификатор. И результат вашего решения равен нулю. Есть другие идеи? - person Marco; 31.05.2013
comment
var_dump(Article::with('category')->first()) что-нибудь дает? - person Rob W; 01.06.2013
comment
да. Это работает правильно, и это также работает правильно: Article::with('category')->find(5). Но если я использую find с массивом, я получаю исключение Array to String Exception. Я смущен. - person Marco; 01.06.2013
comment
Чтобы это работало, вам необходимо определить функцию category () в файле app / models / Article.php. Здесь можно найти помощь laravel.com/docs/4.2/eloquent#relationships - person Ryu_hayabusa; 18.02.2015
comment
Нет, не делай так! Это будет извлекать каждую статью из базы данных (!), А затем просто возвращать ту, которая соответствует $ ids (которая, кстати, должна называться $ id, потому что это должно быть одно значение, а не массив!). Вместо этого см. Принятый ответ. - person orrd; 06.01.2017

Это даст вам результаты на основе массива идентификаторов в Laravel 4.

Article::whereIn('id', $ids)->with('category')->get();
person Adam    schedule 18.02.2014

Создать объект и установить его свойства с отношениями

например, код в вашем контроллере или службе

$article = new Article;
$article = $article->find($id);

$result->article = $article;
$result->article->category = $article->category;

return response()->json($result);

Код в вашей модели

public function category() {
    return $this->hasOne('App\Category');
}
person S1lllver    schedule 20.10.2019