Отношения Laravel «многие ко многим ко многим» с Eloquent?

Я хочу иметь отношения «многие ко многим ко многим» в Eloquent. у меня 3 стола

  • Клиент
  • Ресурсы
  • Товары

У каждого клиента может быть много активов. У каждого актива может быть много продуктов.

На данный момент они связаны с 2-мя промежуточными столами

  • client_asset [идентификатор|client_id|актив_id]
  • актив_продукты [идентификатор|актив_идентификатор|продукт_идентификатор]

Я думаю, что теперь мне нужно будет соединить эти 2 промежуточные таблицы вместе с другой промежуточной таблицей.

  • client_asset_asset_products [id|client_asset_id|asset_products_id]

Но разрешено ли это в Eloquent? Является ли это возможным? и это хорошая практика??

Как связать 2 промежуточные таблицы с новой промежуточной таблицей?

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

Спасибо за любую помощь/информацию.


person adam Kearsley    schedule 20.05.2013    source источник


Ответы (1)


Это нормально, как есть. ORM должен определить, какие продукты принадлежат клиенту, и у него уже есть вся эта информация в БД. С правильно названными методами для отношений вы можете использовать активную загрузку, подобную этой...

$client = Client::with( array( 'assets', 'assets.products' ) )->where_id( 9000 )->first();

// $client->assets array of assets
// $client->assets[0]->products array of products

Вы также можете получить плоский список продуктов, выполнив что-то вроде

$products = Product::join( 'asset_products', 'asset_product.products.id', '=', 'products.id' )
    ->join( 'client_asset', 'client_asset.assets_id', '=', 'asset_products.assets_id' )
    ->where( 'client_asset.client_id', '=', 9000 )
    ->get( 'products.*' );

Если бы это было чем-то, что я делал часто, я бы добавил его как метод в модель клиента.

person Collin James    schedule 20.05.2013