从数据库查询而不是 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 中的对象