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 与原始查询的返回关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5 原始选择查询不返回任何内容

将原始查询转换为雄辩的 laravel

如何在 Laravel 6 中转换原始 sql 查询?

如何在 laravel eloquent 中查询多个关系

Laravel 通过属性获得雄辩的查询构建器关系

laravel 返回与 eloquent 和 laravel 的关系