У меня есть проект под управлением Laravel 5.5, и у меня есть следующие таблицы в базе данных.
USERS (
ID,
NAME,
PERMISSION_ID
)
PERMISSIONS (
ID,
NAME
)
Если я не ошибаюсь, отношения ПОЛЬЗОВАТЕЛЕЙ с РАЗРЕШЕНИЯМИ равны 1.1 (ПОЛЬЗОВАТЕЛИ имеют как минимум 1 разрешение и максимум 1), так что это отношение OneToOne.
В моей пользовательской модели я установил следующие отношения.
class User extends Authenticatable
{
public function permission () {
return $this->hasOne('App\Models\Permission');
}
}
Но таким образом Laravel / Eloquent ищет отношения в таблице РАЗРЕШЕНИЯ. Создание выбора, похожего на:
SELECT * FROM PERMISSIONS WHERE PERMISSIONS.USER_ID = 1
Я уже ознакомился с документацией Laravel и увидел, что могу указать ForeignKey и LocalKey в методе hasOne. Это решает отношения.
Но действительно ли правильно для Laravel / Eloquent по умолчанию извлекать информацию из таблицы РАЗРЕШЕНИЯ? Правильнее было бы не смотреть в таблицу USERS с PERMISSION_ID?
@Редактировать
Благодаря ответу Алексея Мезенина
Я исследовал разницу между hasOne и ownTo. И я нашел следующий ответ:
В чем разница между BelongsTo и HasOne в Laravel
Из того, что я понял, когда внешний ключ находится на другой таблице, правильным является использование hasOne.
Когда внешний ключ находится в собственной таблице шаблона, правильным будет использовать принадлежащий ему.
Я буду в курсе этих деталей в следующий раз, спасибо Алексею Мезенину и jedrzej.kurylo
Ваши отношения перевернуты, вы используете hasOne()
вместо belongsTo
, Используйте эти отношения в User
модель:
public function permission()
{
return $this->belongsTo(Permission::class);
}
И в Permission
модель, которую вы можете добавить hasOne()
отношения (в случае, если вы хотите использовать его):
public function user()
{
return $this->hasOne(User::class);
}
Но обычно одно и то же разрешение может использоваться многими пользователями. Если это так, просто измените hasOne
в hasMany
,
Других решений пока нет …