2017-07-22 10 views
1

ピボットテーブルを使用して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_idCheckoutモデルを選択することはできません。

私は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に「リレーションシップ」を宣言するより適切な方法は何ですか?

答えて

関連する問題