Laravel:在父表上用*表示*而不是* find *的雄辩关系
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel:在父表上用*表示*而不是* find *的雄辩关系相关的知识,希望对你有一定的参考价值。
我有一张桌子posts
和posts_contents
。而且我想从一个帖子中获取内容,如果该帖子有display = 1
。
(因为支持语言,我需要两个单独的表)
帖子:
id user_id display
1 2 0
2 2 1
3 2 0
4 2 1
posts_contents
id post_id lang_id name description
1 1 1 Hello World
2 2 1 Here Is What I wanna show!
3 3 1 Don't Show the others
4 4 1 Hey Display that one too
所以在laravel我使用雄辩的关系,但我只是不明白如何在特定情况下使用它。在文档中,我发现只有以下情况:
$p = AppPosts::find(1)->contents;
哪个效果很好,但我想要的是这样的:
$p = AppPosts::where('display',1)->contents;
但它不起作用......所以问题是:这样做的正确方法是什么?
任何帮助表示赞赏,谢谢!
更新
我需要一次获得多个帖子,而不仅仅是一个。
你想使用像这样的find()
方法:
$post = AppPosts::where('display', 1)->find($postId)->contents;
然后在一对一关系的视图中:
{{ $post->description }}
对于一对多:
@foreach ($post->contents as $content)
{{ $content->description }}
@endforeach
如果要加载仅包含一种语言内容的多个帖子,请使用语言过滤。使用with()
来eager load内容:
$posts = AppPosts::where('display', 1)
->with(['contents' => function($q) use($langId) {
$q->where('lang_id', $langId);
}])
->get();
然后在一对一的视图中:
@foreach ($posts as $post)
{{ $post->contents->description }}
@endforeach
对于一对多:
@foreach ($posts as $post)
@foreach ($post->contents as $content)
{{ $content->description }}
@endforeach
@endforeach
你可以读一下find()
和get()
方法here之间的区别。
AppPosts::where
将返回一个集合。因此,如果您只想要1个结果,那么您应该使用AppPosts::where('display',1)->first()->contents
在调用任何关系之前,您需要调用first
方法:
$p = AppPosts::where('display', 1)->first()->contents;
或者,如果您想要获取帖子集合,您可以:
$posts = AppPosts::where('display', 1)->get();
$posts->each(function ($post) {
$post->contents;
});
否则,您将只有一个Query Builder对象,而没有您想要的实际结果。
以上是关于Laravel:在父表上用*表示*而不是* find *的雄辩关系的主要内容,如果未能解决你的问题,请参考以下文章