Laravel 使用 eloquent 从另一个 table 获取价值

Laravel getting value from another table using eloquent

我 table 是这样的:

用户table:

+----+---------+------------+
| id |  name   |    level   |
+----+---------+------------+
|  1 |  user 1 |     1      |
|  2 |  user 2 |     2      |
+----+---------+------------+

类别table:

+----+---------+------------+
| id | user_id |    name    |
+----+---------+------------+
|  1 |       1 | category 1 |
|  2 |       2 | category 2 |
|  3 |       2 | category 3 |
+----+---------+------------+

产品table:

+----+-------------+------------+
| id | category_id |    name    |
+----+-------------+------------+
|  1 |       1     | product 1  |
|  2 |       2     | product 2  |
|  3 |       3     | product 3  |
|  4 |       3     | product 4  |
+----+-------------+------------+

我想得到所有user_id = 2到eloquent的产品,我是通过下面的代码得到的:

$id = 2;
$data = product::whereHas('category',  function ($q) use ($id) {
    $q->where('user_id', $id);
})->get();

但是当我想通过$data打印分类名和用户名时,好像不行,我的代码是这样的:

$data->first()->category->name;
$data->first()->user->name;

我可以通过 JOIN 的正常查询构建来解决这个问题,只需将 3 个 tables 和 select 连接在一起即可,这很好,但我想解决它eloquent,我有点不知道如何让它发挥作用。

我还有一个问题,我得到了这样的查询生成器代码:

    $id = false;
    if(auth()->user()->level != 1){
        $id = auth()->user()->id;
    }
    $data = DB::table('product')
                ->select('product.*', 'category.name AS category_name', 'users.name AS user_name')
                ->join('category', 'category.id', '=', 'product.category_id')
                ->join('users', 'users.id', '=', 'category.user_id')
                ->when($id, function($query, $id){
                    return $query->where('users.id', $id);
                })
                ->get();

这段代码的思路是当user level = 1时,我会得到所有的产品,但是当user level != 1时,我会得到user id = $id的所有产品,问题是:我如何将其转换为 eloquent?我得到了自己的答案,但我认为这还不够好。

谢谢。

在产品模型中写下这段代码

public function category()
{
    return $this->belongTo(Category::class,'category_id');
}

在类别模型中

public function user()
{
    return $this->belongTo(User::class,'user_id');
}

现在您可以获得带有类别和用户的产品。

$product = Product::with('category.user')->whereRelation('category','user_id',2)->first();
$product->category->name; // get category name
$product->category->user->name; // get user name

你可以检查 对我有帮助:

User::where('id', $x)->with(['category.product'])->first();
//or
User::with(['category.product'])->find($x);

假设您已经在 user.php

中建立关系
public function category()
{
    return $this->belongTo(Category::class,'category_id');
}

在category.php

public function user()
{
    return $this->belongTo(User::class,'user_id');
}