Как добавить дополнительные отношения столбцов в сводной таблице в Laravel - PullRequest
0 голосов
/ 02 июля 2019

Версия: Laravel 5.4

У меня есть 3 модели

Модель: сотрудник

    protected $fillable = ['name'];
    public function emails(){
        return $this->belongsToMany('App\Email')->using('App\EmailEmployee');
    }

Модель: электронная почта

    protected $fillable = ['username'];
    public function employees(){
        return $this->belongsToMany('App\Employee')->using('App\EmailEmployee');
    }

Каждый сотрудник имеет много доступа к электронной почте, а электронные письма распределяются среди многих сотрудников. Но у меня есть еще один столбец в email_employee таблице

email_id                    (emails table)
employee_id                 (employees table)
assigned_by                 (employees table)

как связать столбец assigned_by с employees table

Поворотная модель

    use \Illuminate\Database\Eloquent\Relations\Pivot;
    class EmailEmployee extends Pivot{
        public function assignedBy(){
            return $this->belongsTo('App\Employee');
        }
    }

Я пытался


    $email = Email::find(1);
    dd($email->employee[0]->pivot->assignedBy);

но не работает

Ответы [ 3 ]

1 голос
/ 02 июля 2019

Модель пользовательских промежуточных таблиц

Чтобы решить вашу проблему, вы должны использовать метод ->using() для метода belongsToMany.

Подраздел «Определение пользовательских моделей промежуточных таблиц»в этой ссылке кратко описывается это. eloquent-relations # many-to-many

Вы в основном создаете модель для сводной таблицы, чтобы вы могли определить дополнительные отношения к ней.

Вы по-прежнему можете получать доступ к данным из Blade и контроллеров, как и сейчас, поскольку Laravel по-прежнему будет иметь дело с вашими отношениями.Однако вы можете получить доступ к сводной таблице с помощью ->pivot, и, как вы сказали laravel использовать модель для сводной таблицы, вы также можете получить доступ ко всем функциям, определенным отношениями, из этой модели.

Пример:

Сотрудник

class Employee extends Model
{
protected $fillable = ['name'];
    public function emails(){
        return $this->belongsToMany('App\Email')
        ->using('App\PivotModel');
    }
}

Электронная почта

 class Email extends Model
    {
    protected $fillable = ['username'];
        public function employees(){
            return $this->belongsToMany('App\Employee')
            ->using('App\PivotModel');
        }
    }

PivotModel

class EmailEmployee extends Pivot
{
    public function assignedBy(){
            return $this->belongsTo('App\Employee','assigned_by');
        }
}

Обязательно расширяйте Pivot на модели Pivot, а не на модели

Теперь вы можете просто сделать:

$user->emails()->first()->pivot->assignedBy

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

Если вам просто нужно значение столбца, а не значение отношения, добавьте ->withPivot('assigned_by'), что позволит вам получить доступ к значению напрямую.

Если вы хотите провести аудит после выполнения назначения, вы также можете добавить ->withTimestamps(), если в вашей сводной таблице есть временные метки, чтобы вы тоже могли получить к ним доступ.

0 голосов
/ 02 июля 2019

Изменения в модели Pivot

Модель Pivot

    use \Illuminate\Database\Eloquent\Relations\Pivot;
    class EmailEmployee extends Pivot{
        public function assignedBy(){
            return $this->belongsTo('App\Employee','assigned_by');
        }
    }
0 голосов
/ 02 июля 2019

Вы можете использовать пользовательскую сводную модель

EmailEmployee

class EmailEmployee extends Pivot
{
    public function giver()
    {
        return  $this->belongsTo('App\Employee');
    }
}

Сотрудник

class Employee extends Model
{
    public function emails(){
        return $this->belongsToMany('App\Email')->using('App\EmailEmployee');
    }
}

Электронная почта

class Email extends Model
{
    public function employees()
    {
        return $this->belongsToMany('App\Employee')->using('App\EmailEmployee');
    }
}

Таким образом, вы можете получить доступgiver от $ email-> pivot-> giver;

...