Laravel Eloquent - объединение двух таблиц через другую таблицу - PullRequest
0 голосов
/ 07 ноября 2018

Я строю отношения между 2 таблицами через 3 таблицы. Всего у меня 3 таблицы.

1.) Адреса

Schema::create('addresses', function (Blueprint $table) {
    $table->increments('id');
    $table->text('line_1_number_building')->nullable();
    $table->text('line_2_number_street')->nullable();
    $table->text('line_3_area_locality')->nullable();
    $table->text('city')->nullable();
    $table->text('zip_code')->nullable();
    $table->text('state_province_county')->nullable();
    $table->text('country')->nullable();
    $table->longText('other_address_details')->nullable();
    $table->timestamps();
});

2.) Штаты

Schema::create('staffs', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('staff_category_id');
    $table->integer('gender_id');
    $table->text('staff_job_title')->nullable();
    $table->text('staff_first_name')->nullable();
    $table->text('staff_middle_name')->nullable();
    $table->text('staff_last_name')->nullable();
    $table->text('staff_qualifications')->nullable();
    $table->date('staff_birth_date');
    $table->longText('other_staff_details')->nullable();
    $table->timestamps();
});

3.) Штатные адреса

Schema::create('staff_addresses', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('staff_id');
    $table->integer('address_id');
    $table->date('date_address_from')->nullable();
    $table->date('date_address_to')->nullable();
    $table->timestamps();
});

Теперь я хочу получить список всех адресов для любой записи персонала. Я попробовал приведенный ниже код, но он возвращает адреса, которые соответствуют идентификатору сотрудника

Что я пробовал

public function saddresses()
{
    return $this->hasManyThrough('App\addresses','App\staff_addresses','staff_id','id');
}

Что я получил

Address : [{"id":3,"line_1_number_building":"Hasan 2 line 1","line_2_number_street":"Hasan 2 line 2","line_3_area_locality":"Hasan 2 line 3","city":"Hasan 2 city","zip_code":"Hasan 2 zip code","state_province_county":"Hasan 2 state","country":"Hasan 2 country","other_address_details":"Hasan 2 other details","created_at":null,"updated_at":null,"staff_id":5},{"id":4,"line_1_number_building":"Sadiq 2 line 1","line_2_number_street":"Sadiq 2 line 2","line_3_area_locality":"Sadiq 2 line 3","city":"Sadiq 2 city","zip_code":"Sadiq 2 zip code","state_province_county":"Sadiq 2 state","country":"Sadiq 2 country","other_address_details":"Sadiq 2 other details","created_at":null,"updated_at":null,"staff_id":5}] 

Лучший вид

Подскажите, пожалуйста, как мне построить правильные отношения?

С уважением, Хасан Раджани.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Это идеальное решение @Capt. Teemo. Но если вам нужен адрес для конкретного сотрудника, то здесь я предоставил решение.

Вы должны определить эту функцию в Модель персонала .

public function addresses() { return $this->belongsToMany('App\addresses'); }

Запрос на получение всех адресов $ staffId (где $ staffId - это идентификатор таблицы персонала)

$data = Staff::with('addresses')->where('id', $staffId)->first();

А также, если вы хотите получить дополнительные атрибуты в сводной таблице, вы должны указать их при определении отношения.

public function addresses() { return $this->belongsToMany('App\addresses')->withPivot('date_address_from', 'date_address_to'); }

Кроме того, вы можете поддерживать столбцы create_at и updated_at автоматически, используя метод withTimestamps в отношениях.

Для справки: https://laravel.com/docs/5.7/eloquent-relationships#many-to-many

0 голосов
/ 07 ноября 2018

Сначала попробуйте исправить ваши соглашения об именах. Все было бы намного проще, если бы вы следовали соглашению об именах laravel. Вот руководство .

  • Сводные таблицы должны быть единичными именами моделей в алфавитном порядке (изменить staff_addresses на address_staff)

Тогда используйте belongsToMany отношение.

персонал модель:

public function addresses()
{
    return $this->belongsToMany('App\addresses');
}

Вот как вы запрашиваете:

$data = Staff::with('addresses')->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...