Laravel: получить сопоставление сводной таблицы - PullRequest
0 голосов
/ 06 марта 2020

У меня есть несколько таблиц:

Quote
    id_quote (PK)

ItemQuote
    id_item_quote (PK)
    quote_id (FK)
    item_id (FK)

Item
    item_id (PK)

На каждом ItemQuote может быть несколько Сервис s:

ItemQuoteService
    id_item_quote_service (PK)
    item_quote_id (FK)
    service_id (FK)

Service
    id_service (PK)

Схема: enter image description here

Я использую две настраиваемые сущности сводки, потому что есть другие поля в отношении:

class Quote extends Model {
    // ...
    public function items() {
        return $this->belongsToMany(Item::class, 'ItemQuote', 'quote_id')
            ->using(ItemQuote::class);
    }
}

class ItemQuote extends Model {
    // ...
    public function services() {
        return $this->belongsToMany(Service::class, 'ItemQuoteService', 'id_item_quote')
            ->using(ItemQuoteService::class);
    }
}

Когда я ' получая цитату , я легко могу получить туз ItemQuote

$quote = Quote::with([
      'items',
    ])->findOrFail($id);

$quote->items->pivot // contains the attributes of ItemQuote

Я также хочу иметь доступ к атрибутам ItemQuoteService . Но я не знаю, что передать функции with, чтобы она заработала.

$quote = Quote::with([
      'items.pivot.service', // NOT WORKING
    ])->findOrFail($id);

Как получить доступ к атрибутам Quote->ItemQuote->ItemQuoteService (из выборки одного Цитата )?

1 Ответ

1 голос
/ 06 марта 2020

Вы можете получить их, используя дополнительное отношение:

// Class Quote
public function ItemQuoteServices()
{
    return $this-hasManyThrough(ItemQuoteService::class, ItemQuote::class, 'quote_id', 'item_quote_id');
}

Затем вы вызываете его, используя $quote->with(['itemQuoteServices']);.

Вам необходимо дважды проверить эти 3-й и 4-й параметры, это может сработать, если вы их пропустите.

Вы также можете создать ItemQuoteServices() для класса Item (почти такой же код), но затем вам придется вызывать его, используя ->with(['items', 'items.itemQuoteServices']), что извлекает немного больше данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...