Красноречивые отношения не работают, если dd () не виден - PullRequest
1 голос
/ 11 июня 2019

Ссылка: Laravel Eloquent отношения не объект при выполнении чего-либо, кроме dd ()

Я пытаюсь вывести отношение Laravel в Blade.Тем не менее, это {{ $video->channel->id }} возвращает не объектную ошибку.Но когда dd ed, например, {{ dd($video->channel->id) }}, значение есть.Я так сильно дергал себя за волосы из-за этого ... Что происходит?Почему вывод выводится только тогда, когда переменная dd ed?

Я тестирую на PHP 7.2 с Laravel 5.6.Отношения устанавливаются в соответствии с документацией Eloquent.Я попытался извлечь данные, как это:

$ videos = Video :: where ('foo', 'bar') -> with ('channel') -> take (100) -> get ();

и

$ videos = Video :: where ('foo', 'bar') -> take (100) -> get ();

То же самое;тот же вывод / ошибка.

$tokens = preg_split("/[\s,]+/", $q);
$videos = Video::with('channel')
  ->where(function ($query) use ($tokens) {
    foreach ($tokens as $token) {
      $query->orWhere('title', 'LIKE', "%$token%");
    }
   })
  ->take(100)
  ->get();
// foreach ($videos as $video)
{{ $video->channel->id }} // non-object error
{{ dd($video->channel->id) }} // WORKS! IDK Why...

Trying to get property 'id' of non-object - фактический журнал ошибок.

РЕДАКТИРОВАТЬ:
Ниже приведено изображение коллекции $videos, извлеченное из базы данных,Если в dd() что-то выводится нормально, я могу только предположить, что я получаю данные правильно, да?

enter image description here

1 Ответ

1 голос
/ 11 июня 2019

Когда вы делаете это в цикле, ошибка

Попытка получить свойство 'id' необъекта

означает, что 1 итерация $video->channel возвращает необъект (вероятно null), и вы не можете получить доступ к свойству ->id его (так как null не имеет никаких свойств и т. Д. )

Причина, по которой работает dd(), заключается в том, что он сбрасывает и умирает на первой итерации, в которой есть канал. Чтобы справиться с этим, просто добавьте предложение @if():

@foreach($videos AS $video)
  @if($video->channel)
    {{ $video->channel->id }}
  @else 
    ...
  @endif
  ...
@endforeach

Или, в запросе, чтобы получить $videos, установите взаимосвязь:

$videos = Video::where('foo', 'bar')->has('channel')->with('channel')->take(100)->get();

Таким образом, $video->channel не будет null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...