Laravel:在父表上用*表示*而不是* find *的雄辩关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel:在父表上用*表示*而不是* find *的雄辩关系相关的知识,希望对你有一定的参考价值。

我有一张桌子postsposts_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 *的雄辩关系的主要内容,如果未能解决你的问题,请参考以下文章

在父表和查找表之间创建 Eloquent 关系?

为啥嵌套表在父表之外呈现?

Sequelize:急切加载和排序(在父表上)

在父表视图的同级详细视图之间导航

在父表上存储 1:N 关系中的特定列

使用复选框在父表中搜索 (Oracle Forms Builder)