【问题标题】:running raw SQL but return array of model instances运行原始 SQL 但返回模型实例数组
【发布时间】:2017-02-17 20:57:41
【问题描述】:

我想运行一条sql语句,返回值是一个模型数组,目前返回的是一个stdClass数组。

我正在做这样的事情

DB::select('some sql statement')

返回结果类似于

array(2) {
  [0]=> object(stdClass)#524 (7) .....
  [1]=> object(stdClass)#525 (7) .....

我宁愿

array(2) {
  [0]=> object(App\Feed)#524 (7) .....
  [1]=> object(App\Feed)#525 (7) .....

查询只涉及一个表(没有连接等)。如果我将查询构建器与DB::raw() 等一起使用,代码看起来会更加混乱。我了解 SQL 注入的风险。

有合适的方法吗?

型号代码(Feed.php)

use Illuminate\Database\Eloquent\Model;

class Feed extends Model
{
    .......

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    在这种情况下,您应该使用模型 - https://laravel.com/docs/5.4/eloquent

    【讨论】:

      【解决方案2】:

      保持简单:) http://commandz.io/create-models-from-query-builder/

          $result = Feeds::query()
                      ->where(
                          ['wait_seconds', '>', 'TIMESTAMPDIFF(SECOND, emailed_at, NOW() )'],
                          ['GREATEST(wait_seconds / 6, '.self::MIN_RESCAN_SECONDS.')', '>', 'TIMESTAMPDIFF(SECOND, scanned_at, NOW() )']
                      )
                     ->orWhereNull('scanned_at')
                     ->get();;
          $feeds = \App\Feed::hydrate($result);
      

      【讨论】:

      • 我想运行的实际查询是 SELECT * FROM feeds WHERE ( wait_seconds > TIMESTAMPDIFF(SECOND, emailed_at, NOW() ) AND GREATEST(wait_seconds / 6, '.self::MIN_RESCAN_SECONDS.') > TIMESTAMPDIFF(SECOND, scanned_at, NOW() ) ) OR ( scanned_at IS NULL ) 使用多个 where() 和 DB::raw() 似乎更加混乱
      • 可以Feed::query($sql)->get(); 是我要找的吗?
      • 这也是我改变答案的原因! :) 但我使用了 sql 的查询生成器......
      猜你喜欢
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 2014-11-22
      • 2014-07-01
      • 2021-12-27
      • 2018-12-21
      • 1970-01-01
      • 2017-04-23
      相关资源
      最近更新 更多