2

以前にCodeigniterで使用されていたデータベースのロジックを書き直そうとしています。多対多結合の条件の一部が次のように結合テーブルに格納されるように設計されています。

Table user
  - user_id
  ...

Table avatars
  - user_id
  - image_id
  - uploaded_timestamp
  - deleted_timestamp

Table images
  - image_id
  ...

この場合、アバターテーブルを介してユーザーに関連付けられたすべての画像を取得し、アップロードされた時間の降順で、削除されたアバターを含めないようにします(deleted_timestampはnullではありません)。

EloquentのhasManyを使用すると、結合テーブルの条件が許可されないことがわかりました。この効果を達成するための最もクリーンな方法は何ですか、またはCodeigniterのアクティブレコードクラスで使用していた方法で完全なクエリを構築することに頼る必要がありますか?

注:を使用することを提案するこの回答を見つけまし->hasMany(..)->with('another_column_from_pivot_table')たが、それはLaravel3のEloquent実装でのみ機能するようです。どうやら->withはイーガーローディング専用になりました。

4

1 に答える 1

4

hasMany()は、1対多の関係を対象としています。多対多はbelongsToMany()を期待します-これは、反復(「ピボット」)テーブルに関連するステートメントです。

試したことはありませんが、belongsToMany()はwhere()ステートメントでは機能しないと思います。hasMany()はwhere()でうまく機能することを私は知っています。

あなたがする必要があるかもしれないことは、3番目のモデルクラスを作成することです:

(警告:テストされていないコード)

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 に答える