Laravel 4雄辩:多对多的条件加入表
问题描述:
我试图重写以前与Codeigniter一起使用的数据库的一些逻辑。设计是这样的一些的条件多到一对多联接存储在加盟表所示:Laravel 4雄辩:多对多的条件加入表
Table user
- user_id
...
Table avatars
- user_id
- image_id
- uploaded_timestamp
- deleted_timestamp
Table images
- image_id
...
在这种情况下,我想通过替身与用户相关联的所有图片表,按上传时间降序排序,不包括已删除的头像(deleted_timestamp不为空)。
我发现使用Eloquent的hasMany不允许加入表中的条件。什么是最简单的方法来实现这种影响,还是我需要求助于以我曾经使用Codeigniter的活动记录类的方式构建完整查询?
注:我发现this answer这表明使用->hasMany(..)->with('another_column_from_pivot_table')
,但似乎只与Laravel 3雄辩的实施工作。看来 - >现在只用于eagar加载。
答
hasMany()适用于一对多关系。多对多期望belongsToMany() - 这是与itermediate(“数据透视表”)关联的语句。
我还没有尝试过,但我可以相信belongsToMany()不会与where()语句一起使用。我知道hasMany()对where()很好。
你可能需要做的是建立第三个模型类:
(警告:未经测试的代码)
class User extends Eloquent {
public avatars() {
return $this->hasMany('Avatar')
->where ('deleted_timestamp',0)
->orderBy('uploaded_timestamp','desc');
}
}
class Avatar extends Eloquent {
public image() {
return $this->belongsTo('Image');
}
}
class Image extends Eloquent {
}
你会访问您的图片作为...
$avatars = User::find($user_id)->avatars();
foreach ($avatars as $avatar) {
echo '<img src="$avatar->image->url">';
}
谢谢。我还发现你可以使用' - > withPivot('column_name')'来获取从belongsToMany返回的数据透视表的列值。但正如你指出的那样,这仍然让我无法添加订单以及在哪里过滤集合。你的方法将会起作用,同时使用foreach对这个集合进行手动提取和排序,但是你的理想更为理想。谢谢! – epocsquadron 2013-02-19 21:15:17