我有一个复杂的原始SQL查询,我不想将其转换为查询构建器。有没有办法将查询结果映射到模型?
简而言之,我有这样的疑问:
SELECT users.* FROM users
WHERE exists (super_long_raw_query)
AND many_more_raw_where_clauses
ORDER BY something_complex
etc;
它只返回一个模型中的列(来自对应于模型的表)。
将它转换为“Laravel Query Builder”查询会很糟糕且不可读:
User::where(/* ... */)
->whereExists(function() { /* super complex callback */ } )
->etc(/* ... */)
原始查询更容易(在此特定情况下)阅读。
有没有办法将原始查询映射到模型?(假设它只返回特定模型的列)
旁注:这是一个使用查询参数(?
,:something
)的原始查询,因为我不想进行注射。
答案 0 :(得分:3)
使用fromQuery()
$query = \Illuminate\Support\Facades\DB::raw('select * from users');
$users = \App\User::fromQuery($query, []);
答案 1 :(得分:2)
您可以使用hydrate
方法:
$users = User::hydrate(
DB::select('super_complex_query_with_params', [$params])
);
请参阅:https://laravel.com/api/5.6/Illuminate/Database/Eloquent/Builder.html#method_hydrate
答案 2 :(得分:1)
使用PDO
$sth = $dbh->query("SELECT * FROM user");
$result = $sth->fetchAll(PDO::FETCH_CLASS, "User");
答案 3 :(得分:0)
您可以使用以下任何一种方法
DB::select('your raw query here');
你可以使用像
这样的原始表达式DB::raw('your raw query here');
和
等方法->selectRaw(''),
->whereRaw(''),
->havingRaw('')
查看文档以获取详细信息https://laravel.com/docs/5.6/queries#raw-expressions
Raw语句将作为字符串注入到查询中,因此您应该非常小心,不要创建SQL注入漏洞。