Отношения Ларавела с использованием Eloquent действительно правильны?

У меня есть проект под управлением 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

2

Решение

Ваши отношения перевернуты, вы используете hasOne() вместо belongsTo, Используйте эти отношения в User модель:

public function permission()
{
return $this->belongsTo(Permission::class);
}

И в Permission модель, которую вы можете добавить hasOne() отношения (в случае, если вы хотите использовать его):

public function user()
{
return $this->hasOne(User::class);
}

Но обычно одно и то же разрешение может использоваться многими пользователями. Если это так, просто измените hasOne в hasMany,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]