在laravel [实现过滤器]中加入多个表以及雄辩和热切的加载

Mic*_*rli 3 sql join filter laravel eloquent

我已经拥有什么以及我想做什么:

我有一个网站,允许用户发布自己向其他用户做广告的帖子.现在,我正在尝试为这些帖子实现过滤器,但按用户表,帖子表和其他三个中的值进行过滤.这是我遇到麻烦的地方.

有效的代码,没有过滤器:

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

return View::make('posts/index', compact('posts'));
Run Code Online (Sandbox Code Playgroud)

这就是我尝试过的:

$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();
Run Code Online (Sandbox Code Playgroud)

这一个不断提出这个错误:

SQLSTATE [42S22]:列未找到:1054未知列'的条款'在'playstyle_post.post_id'(SQL:SELECT*FROM users 左联接postsusers.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);
Run Code Online (Sandbox Code Playgroud)

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

在过去的两周里,我尝试过其他几件事,但是当他们不工作的时候我已经把它们扔了出去.这已经踢了我的屁股好半个月,我无法解决为什么我不能让它工作.

所以真的,我现在的麻烦就是试图加入表格并以雄辩的方式将它返回到视图中,这样我就能继续对待它.过滤器本身就是一个问题,但是连接起作用已经证明是困难的部分.

use*_*496 6

不要将一堆关系名称传递给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);
Run Code Online (Sandbox Code Playgroud)

看看你对左连接的尝试,我不知道这些关系是否正确.我的示例假设所有关系都可以直接关联回用户表.否则,您将需要更改阵列上的键以匹配关系的方式.

例如,如果试图涉及playstyles表,但之间的关系playstylesposts不存在,因为你需要去通过users表第一,你只需要改变'playstyles''users.playstyles'.

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