从数据库查询而不是 StdClass 获取模型

Posted

技术标签:

【中文标题】从数据库查询而不是 StdClass 获取模型【英文标题】:Getting Model from DB query instead of StdClass 【发布时间】:2021-12-22 20:45:23 【问题描述】:

使用最新的 Laravel,我编写了下一个查询:

        $news = DB::table('news_content')
            ->join('news_permissions', 'news_content.id', '=', 'news_permissions.news_id')
            ->select('news_content.*')
            ->whereIn('news_permissions.group_id', $allPGs)
            ->get();

在连接中使用 Eloquent 似乎很复杂。 此查询返回 StdClasses 数组,但我需要模型数组,即 NewsContent 模型,以便在 Transformer 中进一步使用它。

铸造方式:

    foreach($news as $item)
            $result[] = (NewsContent)$item;
    

不起作用,从 StdClass 到 Model 的自定义转换的其他解决方案似乎不是最佳的。

有没有更好的方法让模型脱离 Laravels DB 查询?或者从 StdClass 到 Model 的转换过程比这个建议更短:Convert/cast an stdClass object to another class?

【问题讨论】:

为什么会有很多并发症?您实际上只需要将 DB::table('news_content')-> 替换为 NewsContent:: 不可能...我不知道,我错过了一些东西..我无语了。谢谢!我有办法接受您的评论作为答案吗? 另外,为什么不定义关系,那样你可能会失去->join 我已经定义了关系 $this->hasMany(NewsPermission::class, 'news_content_id');但是我现在如何摆脱加入呢? 【参考方案1】:

在连接中使用 Eloquent 似乎很复杂

为什么,你只需要调用你的查询生成器来抛出你的模型:

 $news = NewsContent::join('news_permissions', 'news_content.id', '=', 'news_permissions.news_id')
            ->select('news_content.*')
            ->whereIn('news_permissions.group_id', $allPGs)
            ->get();

请注意,Eloquent 在 Model.php 抽象类内部使用查询构建器:

  * @param  \Illuminate\Database\Query\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder|static
     */

    public function newEloquentBuilder($query)
    
        return new Builder($query);
    

【讨论】:

是的,如果定义了关系,您可以删除连接

以上是关于从数据库查询而不是 StdClass 获取模型的主要内容,如果未能解决你的问题,请参考以下文章

仅从 sequelize 原始查询而不是模型实例中获取 dataValues

快速将 simpleXMLObject 转换为 STDClass?

如何使用 AJAX GET 请求来显示获取的 stdclass 对象

如何从原始查询中检索结果集作为数组而不是 Laravel 3 中的对象

如何使用两个不同的列 mySQL 从查询而不是其他查询中获取数据? [复制]

Django ORM:如何根据所有记录中的列获取唯一记录(需要模型对象而不是特定值对象)