Laravel - Как запросить отношения в сводной таблице - PullRequest
0 голосов
/ 21 мая 2019

Моя настройка

У меня есть настройка отношения многие ко многим и работа с моей базой данных. Это использует сводную таблицу, которая имеет дополнительный столбец с именем "connected_by". Идея в том, что я могу отслеживать пользователя, который создал связь между двумя другими таблицами.

Ниже приведена попытка визуального представления:

разрешения -> permissions_roles -> роли

permissions_roles -> человек

Visual_Representation

Выпуск

В таблице permissions_roles есть дополнительные столбцы с именами «connected_by», и я могу использовать метод -> pivot, чтобы получить значение этого столбца. Проблема в том, что он возвращает только точное значение столбца. Я определил ограничение по внешнему ключу для этого, связанного с people.id, но мне не удается найти способ запросить это из модели Eloquent в laravel.

Вопрос

Как запросить имя человека, связанного со столбцом «connected_by», из запроса Eloquent?

В идеале я бы хотел, чтобы запрос был примерно таким:

permissions::find(1)->roles->first()->pivot->linked_by->name;

НО, поскольку я не определил красноречивые отношения для этого столбца сводной таблицы, я не могу этого сделать, но не могу понять, как бы я это сделал, если это вообще возможно?

Это единственный способ сделать это:

$linkee = permissions::find(1)->roles->first()->pivot->linked_by;
$person = person::find($linkee);
$person->name;

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

->using();

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

Это работает путем добавления ->using() к функции модели return $this->belongsToMany().

Поместив имя вновь созданной сводной модели в метод ->using(), мы можем затем вызвать любую функцию внутри этой сводной модели, как и любой другой красноречивый вызов.

Предполагая, что мои разрешения принадлежат многим ролям, а сводная таблица имеет 3-й столбец с именем «connected_by» (который является внешним ключом пользователя в таблице «Пользователи»):

Моя модель разрешений будет иметь:

public function roles()
    {
      return $this->belongsToMany('App\roles','permissions_roles','permissions_id','roles_id')
        ->using('App\link')
        ->withPivot('linked_by');
    }

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

Обратите внимание, что расширяется ось, а НЕ модель

use Illuminate\Database\Eloquent\Relations\Pivot;

class link extends Pivot
{
    //
    protected $table = 'permissions_roles';

    public function linkedBy()
    {
        return $this->belongsTo('App\users', 'linked_by');
    }
}

Очевидно, что вам необходимо определить противоположную сторону отношения belongsToMany в модели ролей, но как только это будет сделано, я могу использовать следующее, чтобы получить имя человека, связанного с первой ролью в connected_by. колонка:

permissions::find(1)->roles->first()->pivot->linked_by->name;
0 голосов
/ 22 мая 2019

Этого можно достичь с помощью метода toArray в модели разрешений.

/**
 * Convert the model instance to an array.
 *
 * @return array
 */
public function toArray(): array
{
    $attributes = $this->attributesToArray();
    $attributes = array_merge($attributes, $this->relationsToArray());
    // Detect if there is a pivot value and return that as the default value
    if (isset($attributes['pivot']['linked_by']) && is_int($attributes['pivot']['linked_by'])) {
        $linkeeId = $attributes['pivot']['linked_by'];
        $attributes['pivot']['linkee'] = Person::find($linkeeId)->toArray();
        //unset($attributes['pivot']['linked_by']);
    }

    return $attributes;
}
...