как сделать запрос на соединение между тремя таблицами в laravel

Я хочу построить запрос в laravel между тремя таблицами (регионы, страны, пакеты), чтобы таблицы были связаны друг с другом.

  1. таблица регионов содержит (id, имя, описание)
  2. таблица стран содержит (id, region_id, название, описание)
  3. таблица пакетов содержит (id, county_id, pkg_title, pkg_description, цена)

Я хочу выбрать все пакеты, где region_id = 1, как я могу сделать запрос для этой ситуации в построителе запросов laravel. пожалуйста, помогите мне с этим вопросом


person Usman Hafeez    schedule 14.01.2017    source источник
comment
когда вы показываете вам построитель запросов? :)   -  person jycr753    schedule 14.01.2017
comment
Не могли бы вы показать нам свой код?   -  person GabMic    schedule 14.01.2017


Ответы (3)


Установите свои модели следующим образом.

class Region extends Model
{

}

class Country extends Model
{
    public function region()
    {
        return $this->belongsTo(Region::class);
    }
}

class Package extends Model
{
    public function country()
    {
       return $this->belongsTo(Country::class);
    }
}

И укажите следующий запрос внутри вашего метода.

$region_id = 1;
$PackageWithRegions = Package::with([
    'country' => function ($county) use ($region_id) {
        return $county->with([
            'region' => function ($region) use ($region_id) {
                return $region->where('id', $region_id);
            }
        ]);
    }
])->get();
// $PackageWithRegions is a collection of packeges with regions where regiion_id = 1

Подробнее об отношениях красноречия

person Gayan    schedule 14.01.2017
comment
Пожалуйста, сделайте ответ принятым. Рад, что ты нашел это полезным :) - person Gayan; 16.01.2017

Вы можете использовать отношения модели Eloquent для этого, как показано ниже.

В файле контроллера региона

$region = Region::where(['id'=>1])->with(['country'])->get(); ///fetch region with country calls relation declared in region model

В модели Region.php

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Region extends Model {

  protected $table = 'regions';


  public function country(){
    return $this->hasOne('App\Models\Country','region_id')->with(['packages']); ///this will fetch country with all pacckages on matching region_id, join of package  with country is declared in country model. 
  }
}

В модели Country.php

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Country extends Model {

  protected $table = 'countries';

  public function packages(){
    return $this->hasMany('App\Models\Package','county_id'); //join of country with packages on county_id
  }

}

В модели Package.php

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Package extends Model {

  protected $table = 'packages';

}
person Manjeet Barnala    schedule 14.01.2017

Вы можете увидеть в документе Laravel (https://laravel.com/docs/4.2/eloquent ) в разделе Has Many Through, если у вас есть такая модель:

countries
    id - integer
    name - string

users
    id - integer
    country_id - integer
    name - string

posts
    id - integer
    user_id - integer
    title - string

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

class Country extends Eloquent {

    public function posts()
    {
        return $this->hasManyThrough('Post', 'User');
    }

}

Или используя идентификаторы таможенных отношений:

class Country extends Eloquent {

    public function posts()
    {
        return $this->hasManyThrough('Post', 'User', 'country_id', 'user_id');
    }

}

Итак, вы можете получить доступ к сообщениям страны:

$posts = Country::get(2)->posts;

// with where:
$posts = Country::where('name', '=', 'USA')->get()->posts;
person sebasdev    schedule 23.06.2017