hasManyThrough Laravel отношение - PullRequest
       7

hasManyThrough Laravel отношение

0 голосов
/ 29 августа 2018

У меня есть три таблицы ниже.

+-----------------+   +---------------------+   +-------------+ 
|    products     |   |  product_countries  |   |  countries  |
+-----------------+   +---------------------+   +-------------+ 
|   id            |   |  id                 |   |   id        |
|   name          |   |  product_id         |   |   name      |
|   description   |   |  country_code       |   |   code      |
+-----------------+   |  other columns      |   +-------------+
                      +---------------------+

hasManyThrough в модели Country :: class, чтобы получить все продукты.

public function products()
{
    return $this->hasManyThrough(
        'App\Product',
        'App\ProductCountry',
        'product_id', // Foreign key on feeds table...
        'id', // Foreign key on articles table...
        'code', // Local key on users table...
        'country_code' // Local key on feeds table...
    );
}

Я хочу продукты, которые относятся к странам или одной стране:

$user = \App\Models\Country::find(1);
dd($user->products);

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Многие-ко-многим - правильное отношение модели. Вам нужно добавить свое имя таблицы во второй аргумент, если не Eloquent автоматически создаст для вас в алфавитном порядке (например, country_product). Вам не нужно создавать ProductCountry модель, потому что это всего лишь сводная таблица.

Вы не опубликовали свой файл миграции (просто догадываясь), рекомендуется использовать country_id, но если вы используете country_code / product_id в качестве внешних ключей, вам необходимо добавить его также в аргументы как как и в вашем файле миграции (см. также официальную документацию )

 $table->foreign('product_id')->references('id')->on('products');
 $table->foreign('country_code')->references('code')->on('countries');

Попробуйте это ...

В вашей модели товара

class Product extends Model
{
   public function countries()
   {
      return $this->belongsToMany('App\Country','product_countries','product_id','country_code');
   }
}

В вашей стране модель

class Country extends Model
{
   public function products()
   {
      return $this->belongsToMany('App\Product','product_countries','country_code','product_id');
   }
}

В вашем контроллере

use App\Country;

$products = Country::find(1)->products()->get(); //finding by id or

$products = Country::where('country_code',$value)->with('products')->get(); //finding by code
0 голосов
/ 29 августа 2018

Отношение, которое вы описываете, лучше всего подходит ко многим, которое обычно записывается в Laravel как принадлежит ToMany с обеих сторон.

class Product extends Model
{
    public function countries()
    {
        return $this->belongsToMany(Country::class);
    }
}

class Country extends Model
{
    public function products()
    {
        return $this->belongsToMany(Product::class);
    }
}

Если вы придерживаетесь правил именования Laravel:

  • Переименовать product_countries в country_product.
  • В country_product используйте country_id вместо country_code.

... вы должны иметь доступ к отношениям так, как вы ожидаете:

$country = \App\Models\Country::find(1);
dd($country->products);

$countries = \App\Models\Country::with('products')->where(...)->get();
foreach ($countries as $country) {
    dd($country->products);
}

Если вы не хотите придерживаться соглашений, вы можете настроить способ определения отношений. Подробнее см. Документация Laravel .


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

// In your Product model
return $this->belongsToMany(Country::class, 'product_countries', 'country_code', 'product_id');

// In your Country model
return $this->belongsToMany(Product::class, 'product_countries', 'product_id', 'country_code');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...