【问题标题】:One-to-many then eager load an array with Laravel Eloquent ORM一对多然后急切地使用 Laravel Eloquent ORM 加载一个数组
【发布时间】:2012-12-26 14:52:19
【问题描述】:

使用 Laravel 和雄辩的 ORM,我想创建一个数组或对象,其中包含属于特定用户(已登录用户)的所有帖子和相应的 cmets。然后将结果与 Response::eloquent(); 一起使用。返回 JSON。

基本上是伪代码:

All Posts by user ::with('comments').

或

Posts by Auth::user()->id ::with('comments').

我按照通常的用户表、cmets 表和帖子表设置了我的数据库。 cmets 表有一个 post_id,posts 表有一个 user_id。

在没有 Laravel 的情况下要做到这一点很长的路是这样的:

SELECT * FROM posts WHERE user_id = 'user_id'
foreach($result as $post) {
    SELECT * FROM comments WHERE posts_id =  $post->id
    foreach($query as $comment) {
        $result[$i]->comments[$n] = $comment
    }
}

但我想用 Laravel 的 Eloquent ORM 来完成它。

【问题讨论】:

    标签: php orm laravel eloquent


    【解决方案1】:

    看起来你甚至不需要嵌套的渴望加载,你只需要修改返回的查询,所以:

    $posts = Post::with('comments')->where('user_id', '=', 1)->get();
    

    Eloquent 系统中的大多数方法都可以菊花链式连接,通常它们只是返回一个 Fluent 查询对象。

    (我尚未对其进行测试,但我相当确定它会起作用。此外,您不能在 ::all() 上执行此操作,因为它会为您调用 ->get()。您必须挖掘在源代码中找到这个,我认为 Eloquent 文档没有提到它正在做的事情。)

    Eager Loading Documentation 还涵盖了嵌套急切加载,因此您可以使用 cmets 加载所有用户及其帖子:

    您甚至可以急切地加载嵌套关系。例如,让我们 假设我们的 Author 模型具有“联系人”关系。我们可以渴望 从我们的 Book 模型中加载两个关系,如下所示:

    $books = Book::with(array('author', 'author.contacts'))->get();
    

    【讨论】:

    • 你必须定义一个 Comment 类和 BINGO!就像你描述的那样简单。
    • 嵌套关系 (author.contacts) 的急切加载是我一直在努力解决的问题。谢谢!
    • 回复Post::with('comments')->where('user_id', '=', 1)->get(),更易读的解决方案是Auth::user()->posts()->with('comments')->get()
    • 或者,如果它不属于Auth::user(),您可以使用User::find($id) 代替它。
    猜你喜欢
    • 1970-01-01
    • 2021-12-01
    • 2018-09-05
    • 2016-08-17
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    相关资源
    最近更新 更多