有没有办法将原始查询映射到模型

时间:2018-04-04 09:26:15

标签: php laravel laravel-5 eloquent laravel-5.6

我有一个复杂的原始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)的原始查询,因为我不想进行注射。

4 个答案:

答案 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注入漏洞。