Laravel 5.4 - множественные отношения в нескольких таблицах - PullRequest
1 голос
/ 21 мая 2019

На рисунке ниже мы можем видеть отношения между моими таблицами.Моя цель - получить " type " из driver_license_types .Начиная с объекта пользователя.Например:

$user = User::find(1);

и оттуда мне нужно получить тип из driver_license_types. Важная вещь заключается в том, что инструкторы могут иметь несколько записей в таблице instructor_license_types, например: Records instructor_license_types Relations between my tables

Мои текущие решения:

  • В пользовательской модели я создаю инструктор метода, который является отношением «ownTo», модель инструктора.
  • В модели инструктора я создал лицензию метода, которая является отношением «hasMany» с Instructor_license_types
  • В Instructor_license_types я создаю типы методов, которые связаны "hasMany" с Driver_license_types.

И окончательный код выглядит следующим образом: enter image description here

Есть ликакие-нибудь лучшие решения?

Ответы [ 2 ]

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

Если у вас не установлена ​​belongsToMany связь в вашей Instructor модели для DriverLicenseType, я бы предложил добавить одну из них:

public function licenseTypes()
{
    return $this->belongsToMany(DriverLicenseType::class, 'instructors_license_types', 'instructor_id', 'driver_license_type_id');
}
$user = User::find(1);

$licenseTypes = $user->instructor->licenseTypes->pluck('type')->unique();

или если вам нужно, чтобы $licenseTypes был в формате, который у вас есть в вашем вопросе, вы можете сделать что-то вроде:

$licenseTypes = $user->instructor->licenseTypes->map(function ($item) {
    return [$item->id, $item->type];
});
0 голосов
/ 22 мая 2019

Вы можете получить driver_license_types напрямую из модели Instructors, добавив эту функцию:

//PathToModel\Instructor.php

public function license_types()
{
    return $this->belongsToMany('PathToModel\LicenseTypes', 'instructors_license_types');
}

Также добавьте это в модель LicenseType:

//PathToModel\LicenseTypes.php

public function instructors()
{
    return $this->belongsToMany('PathToModel\Instructors', 'instructors_license_types');
}

Таким образом, вы сможете удалить одно из ваших операторов foreach в своем коде:

$user = User::find($id);
if($user->instructor){
    $tmp = [];
    foreach ($user->instructor->license_types as $data) {
        array_push($tmp, [$data->id, $data->type]);
    }
    $user->types = $tmp;
}

То, что это делает, просто пропускает сводную таблицу (instructos_license_types), для получения дополнительной информации об этом вы можете увидеть документы здесь .

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