在laravel [实现过滤器]中将多个表与雄辩和急切的加载一起加入

Posted

技术标签:

【中文标题】在laravel [实现过滤器]中将多个表与雄辩和急切的加载一起加入【英文标题】:Joining multiple tables together with eloquent and eager loading in laravel [implementing filter] 【发布时间】:2014-03-05 03:22:09 【问题描述】:

我已经拥有的和正在尝试做的:

我有一个网站,可以让用户发布帖子,向其他用户宣传自己。现在,我正在尝试为这些帖子实施过滤器,但按用户表、帖子表和其他三个表中的值进行过滤。这就是我遇到麻烦的地方。

按原样工作的代码,没有过滤器:

$posts = Post::with('user','lookingfors','playstyles', 'postcomments')->orderBy('id', 'DESC')->paginate(10);

return View::make('posts/index', compact('posts'));

这是我尝试过的:

$posts = User::leftjoin('posts', function($join)use($region)
            $join->on('users.id', '=', 'posts.user_id');
            $join->on('playstyle_post.post_id', '=', 'posts.id'); // join pivot, then join pivot to playstyles
            $join->on('playstyle_post.playstyle_id', '=', 'playstyles.id');
            //$join->on;
        )->where('users.region_id', 'like', $region)->get();

这个一直报这个错误:

SQLSTATE[42S22]:未找到列:1054 未知列 'on 子句'中的'playstyle_post.post_id'(SQL:select * from usersusers.id = posts.user_idplaystyle_post.post_id = posts.idplaystyle_post.playstyle_id = playstyles.id 其中 users.region_id 喜欢?)(绑定:数组(0 => 6,))

还有:

$posts = Post::with('lookingfors', 'playstyles', 'postcomments')
        ->leftjoin('users', 'posts.user_id', '=', 'users.id')
        //->join('playstyle_post', 'posts.id', '=', 'playstyle_post.post_id')
        ->paginate(10);

这很奇怪(对我来说很好),当'leftjoin'被注释掉时,它显然像以前一样工作,但是当我现在拥有它时,它会显示它应该显示的视图,甚至提取所有正确的值来自 users 表,但不显示通过“with”请求的任何信息。

在过去的两周里,我尝试了其他几件事,但当它们不起作用时,我已经将它们扔掉了。这已经让我大半个月了,我无法理解为什么我不能让它工作。

所以说真的,我现在的麻烦只是试图加入表格并以雄辩的方式将其返回到视图中,这样我就可以继续处理它。过滤器本身就是一个问题,但事实证明让连接起作用是困难的部分。

【问题讨论】:

【参考方案1】:

不要将一堆关系名称传递给with() 函数,而是尝试传递一个数组,将键设置为关系的名称,将值设置为回调函数,并传入查询以进行实际编辑。还必须在需要时使用use ($region)。希望你明白这一点。

我举了一些例子来为每个关系添加过滤器。因为您是在本地处理每一个,所以您不必担心在它们前面加上表名或别名。

$posts = Post::with(array(
'user' => function($query) use ($region)

    // User constraints here
    $query->where('status', 'A');
    $query->where('deleted', '0');
, 
'lookingfors' => function($query)

    // lookingfors constraints here
    $query->where('name', 'somelookingforname');
, 
'playstyles' => function($query)

    // playstles constraints here
    $query->where('name', 'someplaystylesname');
, 
'postcomments' => function($query)

    // Some postcomments constraints here
    $query->where('name', 'somepostcommentsname');
))
->orderBy('id', 'DESC')
->paginate(10);

不过,看看您在左连接方面的尝试,我不知道这些关系是否正确。我的示例假设所有关系都可以直接关联回用户表。否则,您将需要更改数组上的键以匹配应有的关系。

例如,如果尝试关联playstyles 表,但playstylesposts 之间的关系不存在,因为您需要先通过users 表,您只需更改@ 987654328@转'users.playstyles'

如果您发布迁移,我可以进一步帮助您。

【讨论】:

谢谢,我会试一试的。

以上是关于在laravel [实现过滤器]中将多个表与雄辩和急切的加载一起加入的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 雄辩关系中添加多个条件

laravel 雄辩的多个表 where 条件

Laravel 7 雄辩的嵌套条件,用于使用枢轴进行过滤

Laravel - 雄辩的 ORM 关系查询

雄辩的 laravel 关系

Laravel 雄辩不更新 JSON 列:数组到字符串的转换