无法理解雄辩的关系

时间:2019-04-14 23:22:14

标签: laravel eloquent

我无法理解雄辩的关系。

说我有四个带有数据的表

用户

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"}

我希望这是有道理的,感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您在UserCar上定义了错误的关系。

由于与用户和汽车的关系是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_carsCollection实例。基本上与编写$car->user_cars()->get()相同,因此您希望在大多数时候都可以使用。

现在让我们看看您的控制器方法。从技术上讲,您可以返回$user并访问视图中的所有关系,但是每次执行时,这都是对数据库的附加查询。您应该通过首先加载所有急切的数据来避免这种情况。由于您正在使用路由模型绑定来获取$user,因此需要使用load()函数。您甚至可以加载嵌套关系,这正是您要寻找的。

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

详细了解https://laravel.com/docs/5.8/eloquent-relationships