为什么在foreach集合中使用未定义的属性?

时间:2019-05-05 12:00:41

标签: laravel relationship

$conversations = Conversations::with('bulletin', 'messages')->leftJoin('own', 'conversations.bulletin_id', '=',
    'own.id')
    ->select('conversations.*')
    ->where('owner_id', $userId)
    ->orWhere('owner', $userId)
    ->orderBy('updated_at', 'desc')
    ->get();
dd($conversations);

$conversation = Conversations::getInfo($conversations->first());

foreach ($conversations as $conversation) {
    dd($conversation->bulletin);
}

https://i.imgur.com/qne8Xhh.png-第一个dd()的屏幕截图

https://i.imgur.com/OCjFfD0.png-foreach()中的dd()屏幕截图-这里没有任何内容

如果我尝试访问$conversation->bulletin->id,这将是错误的'undefined property ...'

public static function getInfo($conversation)
{
    $conversation->messages = self::find($conversation->id)->messages();
    $conversation->bulletin = self::find($conversation->id)->bulletin();
    $conversation->users = self::find($conversation->id)->users();

    return $conversation;
}

1 个答案:

答案 0 :(得分:1)

之所以发生这种情况,是因为对于某些$conversations或可能是$conversation之一,它没有任何bulletin。结果,当您遍历所有$conversations并访问$conversion->bulletin->id时,一个conversation会导致错误。运行dd时,它只会转储第一个conversation并死亡。结果,您无法正确看到问题所在。

替换以下行:

dd($conversation->bulletin);

有这行,请参阅:

dump($conversation->id, $conversation->bulletin);

我很确定您会看到至少一个对话没有任何公告。

更新

self :: find($ conversation-> id)-> users();将返回关系对象,而不是用户集合。如果要访问用户集合,则应执行self::find($conversation->id)->users。与bulletinmessages

相同

实际上,我认为您不需要此getInfo()方法。您只需要正确使用with查询方法

因此,替换:

Conversations::with('bulletin','messages')

此部分由Conversations::with('bulletin','messages',个用户)