【问题标题】:Laravel 4 Eloquent: Many-to-many with conditions on joining tableLaravel 4 Eloquent:多对多与加入表的条件
【发布时间】:2013-02-04 11:56:07
【问题描述】:

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

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 的 Eloquent 实现。似乎 ->with 现在仅用于 eagar 加载。

【问题讨论】:

    标签: many-to-many laravel laravel-4 eloquent


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我还发现您可以使用-&gt;withPivot('column_name') 来获取数据透视表的列值,该值与来自belongsToMany 的集合一起返回。但是正如您所指出的,这仍然让我无法添加订单以及在哪里过滤集合。您的方法将起作用,同时在集合上使用 foreach 并手动提取和排序,但您的方法更理想。谢谢!
    猜你喜欢
    • 2013-04-24
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2013-05-15
    • 2014-09-27
    • 1970-01-01
    • 2018-04-03
    • 2018-10-05
    相关资源
    最近更新 更多