Модель пользовательских промежуточных таблиц
Чтобы решить вашу проблему, вы должны использовать метод ->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()
, если в вашей сводной таблице есть временные метки, чтобы вы тоже могли получить к ним доступ.