User::where("id", $id) ->with([ 'adviser' => function ($query) { $query->select(['user_id', 'brand_id', 'city_id', 'affiliate_id', 'region_id', 'branch_id', 'framework_name']); }, 'job' => function ($query) { $query->select(['id', 'name']); }])->selectRaw("job.name as job_name")->first()这样可以吗
时间: 2024-01-30 13:02:43 浏览: 70
这段代码的意图是查询某个用户的信息,并且预加载其关联的顾问(adviser)和职位(job)信息,并且将职位名称(job.name)提升到查询结果的上一级。但是,这段代码存在一个问题,就是 selectRaw 方法中的查询语句无法访问 with 方法中预加载的关联模型的属性。
具体来说,with 方法中的查询语句是在关联模型的查询语句中执行的,而 selectRaw 方法中的查询语句是在主模型的查询语句中执行的。这两个查询语句无法直接访问对方的查询结果,因此无法将 `job.name` 的值提升到查询结果的上一级。
为了解决这个问题,可以使用嵌套查询来实现。具体来说,我们可以先执行 with 方法来预加载关联模型,然后在 selectRaw 方法中使用子查询来获取关联模型的属性值,例如:
```php
$user = User::where('id', $id)
->with(['adviser', 'job'])
->selectRaw('(SELECT name FROM jobs WHERE id = users.job_id) as job_name')
->first();
```
这个例子中,我们首先执行 with 方法来预加载关联模型,然后使用 selectRaw 方法来查询职位名称。由于关联模型已经预加载到查询结果中,我们可以直接访问关联模型的属性值。然后,我们使用子查询来获取职位名称,这样就可以将职位名称提升到查询结果的上一级了。
需要注意的是,这种方式可能会导致查询效率降低,因为需要执行一个子查询来获取职位名称。如果职位名称是关联模型的一个属性,建议使用 with 方法来预加载关联模型,而不是使用 selectRaw 方法。
阅读全文