Ускорить запрос через отношения Laravel - PullRequest
0 голосов
/ 13 мая 2019

Есть 3 модели:

First (first_id)
Connection (connection_id, first_id, product_id)
Second (second_id, product_id)

Я хотел бы соединить три модели вместе, используя отношения laravel

First -> присоединенный к Соединению через first_id Connection-> присоединяется к Первому через first_id и присоединяется к Second через product_id Second -> присоединяется к Соединению через product_id

Итак: Первое присоединяется ко Второму через Соединение first_id,product_id

Можно ли это сделать, используя что-то вроде HasManyThrough?

Спасибо за ваше время

Ответы [ 3 ]

1 голос
/ 13 мая 2019

Это зависит от типа отношений, которые разделяет ваша первая модель и вторая модель, а также от типа отношений, который разделяет вторая и третья модель.

, если рассматривать вашу первую модель First и вторую модель Second, имеющую отношение один-к-одному, а также модели Second и Third модели, имеющие отношения один-к-одному.

Это будет $first->second->third; // нет имеет много сквозных отношений требует

Если ваша модель First и модель Second делятся как отношение hasMany-принадлежит к связи, то вам нужно использовать отношение hasManyThrough

пример из документ

class Country extends Model
{
    public function posts()
    {
        return $this->hasManyThrough(
            'App\Post',
            'App\User',
            'country_id', // Foreign key on users table...
            'user_id', // Foreign key on posts table...
            'id', // Local key on countries table...
            'id' // Local key on users table...
        );
    }
}
1 голос
/ 13 мая 2019

Вы можете попробовать использовать вложенные отношения.

Вложенная нетерпеливая загрузка Чтобы загружать вложенные отношения, вы можете использовать синтаксис "точка".Например, давайте готовы загрузить всех авторов книги и все личные контакты автора в одно красноречивое утверждение:

$books = App\Book::with('author.contacts')->get();

Модель книги:

public function author() 
{
    return $this->hasOne('App\Author');
}

Модель автора:

public function contacts() 
{
    return $this->hasMany('App\Author');
}

Документация:

https://laravel.com/docs/5.8/eloquent-relationships

1 голос
/ 13 мая 2019

На вашей первой модели:

public function second () {
    return $this->hasManyThrough(
        Second::class, 
        Connection::class, 
        'product_id', // Foreign key on connection table
        'product_id', // Foreign key on second table
        'first_id', // Local key on first table
        'first_id' // Local key on connection table
    );
}

На основании вашего описания имена столбцов должны работать.

В тинкере вы можете проверить, правильно ли он подключен, выполнив что-то вроде First::first()->second.

...