2

我正在尝试为以前与 Codeigniter 一起使用的数据库重写一些逻辑。该设计使得多对多连接的一些条件存储在连接表中,如下所示:

Table user
  - user_id
  ...

Table avatars
  - user_id
  - image_id
  - uploaded_timestamp
  - deleted_timestamp

Table images
  - image_id
  ...

在这种情况下,我想通过头像表获取与用户关联的所有图像,按上传时间降序排列,不包括已删除的头像(deleted_timestamp 不为空)。

我发现使用 Eloquent 的 hasMany 不允许连接表上的条件。实现这种影响的最干净的方法是什么,或者我是否需要像以前使用 Codeigniter 的活动记录类一样构建完整的查询?

注意:我找到了这个建议使用的答案->hasMany(..)->with('another_column_from_pivot_table'),但这似乎只适用于 Laravel 3 的 Eloquent 实现。似乎 ->with 现在仅用于 eagar 加载。

4

1 回答 1

4

hasMany()用于一对多关系。多对多期望belongsToMany() ——这是与中间(“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">';
}
于 2013-02-19T20:27:33.540 回答