Laravel 与原始查询的返回关系
Posted
技术标签:
【中文标题】Laravel 与原始查询的返回关系【英文标题】:Laravel return relationship with raw query 【发布时间】:2021-09-18 10:45:57 【问题描述】:我正在尝试编写一个查询,我可以在其中返回一组具有相关用户的帖子。基本上,我想返回类似于 with()
使用 Eloquent 所做的事情,但相反,我想使用 raw()
查询来实现它。目前,我正在执行以下操作:
DB::select('SELECT * FROM posts LEFT JOIN users ON posts.user_id = users.id');
我在一个深度为 0 的对象中得到结果,我希望用户位于内部的一个单独对象中,这样我就可以像 post.user.name
一样访问它。我希望我的回复如下所示
[
"id": 1,
"name": "Praesentium molestiae",
"status": 1,
"type": 1,
"author":
"name": "John Doe",
"email": "johndoe@email.com"
,
...
用户模型
public function posts()
return $this->hasMany('App\Post','user_id');
帖子模型
public function user()
return $this->belongsTo('App\User');
【问题讨论】:
你能发布你已经拥有的吗?它是否在某处失败,您是否收到任何错误?你有什么问题? @brombeer 目前我正在做这样的事情 DB::select('SELECT * FROM posts LEFT JOIN users ON posts.user_id = users.id');我在一个深度为 0 的对象中得到结果...我希望用户位于内部的单独对象中...所以我可以像 post.user.name 一样访问 【参考方案1】:制作一个帖子资源来处理这个问题
后控制器
<?php
namespace App\Http\Controllers;
use App\Http\Resources\PostResource;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
public function index()
return PostResource::collection(Post::latest()->get());
发布资源
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class PostResource extends JsonResource
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
return [
'id' => $this->id,
'name' => $this->name,
'status' => $this->status,
'type' => $this->type,
'author' => $this->user,
];
【讨论】:
这会在一个对象中返回结果...我希望用户成为每个帖子中的单独对象...所以我可以访问 post.user.name 该方法还可以...它可以工作...但在性能方面效率不高...这种方法在每次数据库获取后创建本地模型,并且数据库中的 2000 个条目需要 7 秒获取所有内容...原始查询需要 200 毫秒才能获取所有内容以上是关于Laravel 与原始查询的返回关系的主要内容,如果未能解决你的问题,请参考以下文章