我正在尝试为以前与Codeigniter一起使用的数据库重写一些逻辑。设计是这样的,多对多连接的一些条件存储在连接表中,如下所示:
Table user
- user_id
...
Table avatars
- user_id
- image_id
- uploaded_timestamp
- deleted_timestamp
Table images
- image_id
...
在这种情况下,我希望通过头像表获取与用户关联的所有图像,按时间上传时间降序排序,不包括已删除的头像(deleted_timestamp not null)。
我发现使用Eloquent的hasMany不允许连接表上的条件。实现这种影响的最简洁方法是什么,或者我是否需要像以前一样使用Codeigniter的活动记录类来构建完整查询?
注意:我发现this answer建议使用->hasMany(..)->with('another_column_from_pivot_table')
,但这似乎只适用于Laravel 3的Eloquent实施。似乎 - > with现在只用于装载eagar。
答案 0 :(得分:4)
hasMany()适用于一对多关系。多对多期望 belongsToMany() - 这是与itermediate(" pivot")表关联的语句。
我还没有尝试过,但我相信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">';
}