在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
users
在users
.id
=posts
.user_id
和playstyle_post
.post_id
=posts
.id
和playstyle_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
表,但playstyles
和posts
之间的关系不存在,因为您需要先通过users
表,您只需更改@ 987654328@转'users.playstyles'
。
如果您发布迁移,我可以进一步帮助您。
【讨论】:
谢谢,我会试一试的。以上是关于在laravel [实现过滤器]中将多个表与雄辩和急切的加载一起加入的主要内容,如果未能解决你的问题,请参考以下文章