Получить все отношения через многие отношения - PullRequest
0 голосов
/ 07 января 2020

У меня есть User, Account и Item модели.

Account имеет много User отношений, а User имеет много Account отношений. Они определены как многие для многих.

Account имеет много Item отношений, и мне интересно, как получить все Item для всех Account отношений для User.

// User.php:
public function accounts()
{
  return $this->belongsToMany( Account::class );
}

// Account.php
public function users()
{
  return $this->belongsToMany( User::class );
}

// Item.php
public function account()
{
  return $this->belongsTo( Account::class );
}

Любая идея о том, как сделать звонок, как auth()->user()->items или auth()->user()->accounts()->items?

Ответы [ 3 ]

2 голосов
/ 07 января 2020

в соответствии с вашими отношениями, вы можете получить все учетные записи пользователя с каждым элементом в каждой из этих учетных записей следующим образом:

auth()->user()->accounts()->with('items')->get();

, чтобы вышеприведенный оператор работал, вам нужно определить items Отношения на вашей Account модели выглядят следующим образом:

//Account.php
public function items()
{
  return $this->hasMany( Item::class );
}
1 голос
/ 07 января 2020

Если вы просто хотите получить список элементов с этими условиями, начните с модели элемента

$userId = auth()->id();
$items = Item::whereHas('account', function($account) use ($userId) {
    $account->whereHas('users', function($user) use ($userId) {
        $user->where('id','=', $userId);
    });
})->get();
1 голос
/ 07 января 2020

Вы можете определить прямое отношение BelongsToMany, "пропустив" таблицу accounts:

class User extends Model
{
    public function items()
    {
        return $this->belongsToMany(
            Item::class,
            'account_user',
            'user_id', 'account_id', null, 'account_id'
        );
    }
}

$items = auth()->user()->items;
...