2013-02-19 139 views
2

我试图重写以前与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加载。

回答

4

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">'; 
} 
+1

谢谢。我还发现你可以使用' - > withPivot('column_name')'来获取从belongsToMany返回的数据透视表的列值。但正如你指出的那样,这仍然让我无法添加订单以及在哪里过滤集合。你的方法将会起作用,同时使用foreach对这个集合进行手动提取和排序,但是你的理想更为理想。谢谢! – epocsquadron 2013-02-19 21:15:17