ピボットテーブルを使用して2つのモデル間の関係を作成しようとしています。ここに基本的な構造があります。この関係をEloquentで説明する慣用的な方法
Users
id
name
Links
link_id
user_id_from
user_id_to
Checkout
id
user_id
text
アイデアはUser
sがそれらにCheckouts
が割り当てられていることです。またLink
からUser
までです。これにより、User
は、他のUser
に割り当てられたCheckout
にアクセスすることができます。たとえば、レコード(3,5)がLinks
に存在する場合、ユーザー5はユーザー3のCheckout
をすべて見ることができます。
hasManyThrough
またはbelongsToMany
を使用することは選択できません。これは、Eloquentがこれらの関係ヘルパーを使用している場合、Eloquentはプライマリキー(この場合はid
)のみでリンクするためです。代わりにuser_id
でCheckout
モデルを選択することはできません。
私はload
を仮説的に使用して、usersLinkedToMe
(下記参照)、次にload
'チェックアウト'を呼び出すことができます。しかし、私は実際にチェックアウトのコレクションだけを1回の呼び出しで欲しいので、User
オブジェクトに入れ子になっているチェックアウトを引っ張ることを心配する必要はありません。
したがって、今、これは私が関係の作業を持っているかである:
// The users (my) own checkouts
public function checkouts()
{
return $this->hasMany(Checkout::class, 'user_id');
}
// The users who are linked to me, sharing their checkouts with me
public function usersLinkedToMe() {
return $this->belongsToMany(User::class, 'links', 'user_id_to', 'user_id_from')
}
// The checkouts of the users who are linked to me (sharing with me)
public function linkedCheckouts()
{
return Checkout::whereIn('user_id', $this->usersLinkedToMe()->pluck('user_id_from')->toArray())->get();
}
コースの焦点はlinkedCheckouts
です。これは私が望む方法で動作します。しかし、私が異質な人に慣れていないので、私はちょうどその問題をハックしているように感じる。 Eloquentを使用してこの関係を呼び出すには、より慣用的な(自然な)方法が必要であるようです。
linkedCheckouts
に「リレーションシップ」を宣言するより適切な方法は何ですか?