如何在Laravel和Eager负载关系中将多个单独的雄辩模型组合为一个

时间:2016-05-24 12:03:57

标签: php mysql laravel collections eloquent

我有很多单独的模型,我想将它们全部组合起来以利用热量加载。

$match_query = "select * from feeds " .
                "WHERE (user_id IN ($users_size)) " .
                "OR (target_id IN ($slugs_size) AND feedable_type = 'review') " .
                "ORDER BY created_at DESC LIMIT 5;";

//Query works fine and return 2 results 
$results = DB::select($match_query, $consolidatedArray);

    //to convert returned php standard obj to array
    $results = json_decode(json_encode($results), True);

    $all = [];

    foreach($results as $result){
        $x = new \App\Feed($result);

        //I am able to get relation like this for single item
        // $x->user;

        $all[] =  $x;
    }

    //but this thing is not working (i am trying to eager load)
    $data = $all->with('user');

我收到以下错误

ErrorException in FeedsRepository.php line 67:
Trying to get property of non-object

解决方案是什么?

1 个答案:

答案 0 :(得分:0)

$ all是一个数组。数组不是对象。因此,当您使用()调用$ all->时,您会收到错误"尝试获取非对象的属性"。非常简单:)。

您的代码似乎不必要地复杂化了。您在Eloquent和Query Builder中查询并不难。阅读一些文档并开始使用其强大的功能,而不是破解你的方式:)。

您可以使用这个更易读的代码段(或类似内容)替换您的代码:

$results = Feed::whereIn('user_id', $users_size)
            ->orWhere(function($q) use($slugs_size) {
                $q->whereIn('target_id', $slugs_size)->orWhere('feedable_type', 'review');
            })
            ->with('user')
            ->orderBy('created_at', 'desc')->take(5)->get();

这里要记住的重要一点是,eloquent还包含了查询构建器的所有功能。在大多数情况下,它比完整的SQL查询更容易阅读和维护。

阅读材料:

https://laravel.com/docs/master/eloquent

https://laravel.com/docs/master/queries