Я новичок в Laravel. У меня две модели: User и Car. Я хочу получить доступ к данным автомобиля из пользовательского объекта в контроллере, но не смог найти, как это сделать. Кроме того, в базе данных есть столбцы, и администратор отказывается вносить в нее какие-либо изменения.
Вот модель User:
class User extends Model {
protected $primaryKey = 'idUser';
protected $fillable = [
'name', 'age', 'address', 'gender', 'phone', 'email'
];
}
А это моя модель Car:
class Car extends Model {
protected $primaryKey = 'idCar';
protected $fillable = [
'carNumber', 'carMachineNumber', 'type', 'model', 'year', 'idUser'
];
public user(){
return $this->belongsTo(User::class, 'idUser');
}
}
Я хочу, чтобы в контроллере и в шаблонах лезвий я мог получить доступ к данным автомобиля от объекта пользователя. Например, когда я хочу получить данные о типе автомобиля, я могу получить к ним доступ:
$user->car->type
Было бы даже лучше, если бы я смог получить доступ ко всем автомобилям, которые есть у пользователя, с помощью этой строки кода:
$user->car->all();
Как сделать это возможным? Что мне добавить к контроллерам, не внося никаких изменений в базу данных? Спасибо.






У вас нет стандартного первичного ключа id, поэтому вам придется указать все ключи в отношении (idCar).
Модель автомобиля
public function user() {
return $this->belongsTo(User::class, 'idUser', 'idCar');
}
Но это даст вам $car->user, который является владельцем машины.
Благодаря тому, как вы спроектировали свою базу данных, у пользователя может быть много автомобилей.
Модель пользователя
public function cars() {
return $this->hasMany(Car::class, 'idUser', 'idUser');
}
Если вы хотите получить автомобили, принадлежащие пользователю, вы можете
$user->cars;
или же
foreach($user->cars as $car) {
// $car
}
В модели Car есть поле idUser, которое является внешним ключом для модели User. idCar - это не внешний ключ, а первичный ключ.
Правильно, автомобиль может принадлежать одному пользователю, но у пользователя может быть много автомобилей.
Могу ли я получить доступ к данным автомобиля от пользователя без необходимости присоединяться к таблице / использовать оператор where и просто используя красноречивые отношения, такие как $user->car->all()?
да, просто $ user-> cars должны доставить вам все автомобильные объекты.
@Dhana D. вы пытаетесь использовать $ user-> car-> all (), но all () работает только с моделью и не работает с красноречивым отношением. Итак, добавьте отношение cars () в свою модель пользователя и получите доступ ко всем автомобилям, которые есть у пользователя, например $ user-> cars (), как и предложил Анурат.
Не могли бы вы объяснить, почему вы использовали
idUserв качестве внешнего ключа дляidCar? Разве эта связь не означает, что Автомобиль 1 принадлежит пользователю 1, Автомобиль 2 принадлежит пользователю 2 и так далее? Это соответствует случаю Автомобиль 1 и автомобиль 2 принадлежат пользователю 1?