我无法理解雄辩的关系。
说我有四个带有数据的表
用户
id
...
UserCars
user_id
car_id
color_id
汽车
id
make
model
颜色
id
color
现在,我了解了如何通过以下方式为所选用户获取UsersCars
User.php Model
public function cars()
{
$this->hasMany(Car::class);
}
然后我可以使用
public function show(User $user)
{
$cars= $user->cars;
return $cars;
}
因此,假设给定的用户ID 1有2辆车,我可以使用$ user-> cars()来获得他的车,这在视图中给了我类似的东西
{"id":1, "car_id":3, "color_id": 2}
{"id":1, "car_id":10, "color_id": 4}
但是我没有得到的是如何进一步获得相关ID的实际值。因此,一旦我在控制器中将$ users-> cars()作为$ cars传递给我的视图,便可以获取用户汽车的实际品牌,型号和颜色。
类似
@foreach ($cars as $car)
{{ $car->make }} : {{ $car->model }}
{{ $car->color }}
@endforeach
所以一旦我调用$ user-> cars(),我就需要
{"id":1, "car_id":3, "make" => "Ford", "model" => "Fiesta", "color_id": 2, "color":"red"}
{"id":1, "car_id":10, "make" => "Volkswagon", "model" => "Golf", "color_id": 4, "color":"blue"}
我希望这是有道理的,感谢您的帮助。
答案 0 :(得分:0)
您在User
到Car
上定义了错误的关系。
由于与用户和汽车的关系是many-to-many
,因此您必须使用belongsToMany()
雄辩的关系。
doc => https://laravel.com/docs/5.8/eloquent-relationships#many-to-many
用户模型
public function cars()
{
return $this->belongsToMany(Car::class, 'user_cars', 'user_id', 'car_id');
}
汽车型号
public function users()
{
return $this->belongsToMany(User:class, 'user_cars', 'car_id', 'user_id');
}
然后您可以从cars
访问user
,或从users
访问car
。
答案 1 :(得分:0)
您可以通过关系访问所有这些数据。只需定义它们并根据需要加载它们。首先让我们定义模型文件中的每个基本关系
在“用户”模型中:
// User.php
public function user_cars()
{
return $this->hasMany(App\UserCar::class);
}
在UserCars模型中:
// UserCar.php
public function user()
{
return $this->belongsTo(App\User::class);
}
public function car()
{
return $this->belongsTo(App\Car::class);
}
public function color()
{
return $this->belongsTo(App\Color::class);
}
在汽车模型中:
// Car.php
public function user_cars()
{
return $this->hasMany(App\UserCar::class);
}
在定义了所有这些内容之后,您只需调用它们即可访问它们。 $car->user_cars()
和$car->user_car
之间的区别是返回的对象。
$car->user_cars()
是实例HasMany
对象,而$car->user_cars
是Collection
实例。基本上与编写$car->user_cars()->get()
相同,因此您希望在大多数时候都可以使用。
现在让我们看看您的控制器方法。从技术上讲,您可以返回$user
并访问视图中的所有关系,但是每次执行时,这都是对数据库的附加查询。您应该通过首先加载所有急切的数据来避免这种情况。由于您正在使用路由模型绑定来获取$user
,因此需要使用load()
函数。您甚至可以加载嵌套关系,这正是您要寻找的。 p>
public function show(User $user)
{
// This tells eloquent to add the nested relationships to your User instance.
$user->load('user_cars.car', 'user_cars.color');
return $user;
}
接下来,您可以根据需要在视图中访问它们
@foreach ($user->user_cars as $user_car)
{{ $user_car->car->make }}
{{ $user_car->car->model }}
{{ $user_car->color->color }}
@endforeach