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

Is there a way to map a raw query to a Model

我有一个复杂的原始 SQL 查询,我不想将其重新转换为查询生成器。有没有办法将查询结果映射到模型?

总之,我有这样的疑问:

SELECT users.* FROM users
WHERE exists (super_long_raw_query)
AND many_more_raw_where_clauses
ORDER BY something_complex
etc;

它只有 returns 列来自一个模型(来自对应于一个模型的 table)。

将其转换为 "Laravel Query Builder" 查询会很糟糕 不可读 :

User::where(/* ... */)
    ->whereExists(function() { /* super complex callback */ } )
    ->etc(/* ... */)

原始查询更易于阅读(在本例中)。

有没有办法将原始查询映射到模型?(假设只有 returns 特定模型的列)

旁注:这是一个使用查询参数(?:something)的原始查询,因为我不想注入。

您可以使用以下任何一种方法

DB::select('your raw query here');

你可以使用像

这样的原始表达式
DB::raw('your raw query here');

等方法
->selectRaw(''),
->whereRaw(''),
->havingRaw('')

查看文档了解详细信息https://laravel.com/docs/5.6/queries#raw-expressions

原始语句将作为字符串注入到查询中,因此您应该格外小心,不要造成 SQL 注入漏洞。

使用 PDO

$sth = $dbh->query("SELECT * FROM user");
$result = $sth->fetchAll(PDO::FETCH_CLASS, "User");

您可以使用 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

使用fromQuery()

$query = \Illuminate\Support\Facades\DB::raw('select * from users');
$users = \App\User::fromQuery($query, []);