【问题标题】:Is there a way to map a raw query to a Model有没有办法将原始查询映射到模型
【发布时间】:2018-04-04 09:26:15
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    使用fromQuery()

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

    【讨论】:

    【解决方案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

    【讨论】:

      【解决方案3】:

      使用 PDO

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

      【讨论】:

      • 谢谢! +1。我仍然找到了这个方法:stackoverflow.com/a/49647751/978690 这似乎更像 Laravel 风格(或 Laravel 风格)
      • 这确实更像 Laravel!我使用教义-dbal,但当框架过于复杂时,我倾向于使用 PDO。它应该总是可读的:-)
      【解决方案4】:

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

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

      【讨论】:

      • 好的,谢谢。我知道这些方法。我的问题是我可以将原始查询映射到模型。
      • 我认为如果您需要将查询映射到您需要使用 eloquent 的模型
      • 可以使用带有雄辩的原始查询方法,Model::select(DB::raw('query'))->get();
      • 这不能回答 OP 的问题。
      猜你喜欢
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      相关资源
      最近更新 更多