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');
}
我 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');
}