【问题标题】:How can I query raw via Eloquent?如何通过 Eloquent 查询原始数据?
【发布时间】:2014-05-20 11:10:08
【问题描述】:

我正在尝试在我的 Laravel 应用程序中进行查询,并且我想为我的查询使用正常的结构。这个类要么使用 Eloquent,所以我需要找到一些东西来做一个完全原始的查询。

可能类似于Model::query($query);。只有这样是行不通的。

【问题讨论】:

    标签: php laravel laravel-4 eloquent


    【解决方案1】:

    如果你也需要这个。 orderByRaw() 函数用于您的订单。

    喜欢

    WodSection::orderBy('score_type')

    ->orderByRaw('FIELD(score_type,"score_type") DESC')

    ->get();

    【讨论】:

      【解决方案2】:

      如果您想选择信息,它是DB::select(Statement goes here),请记住,除非您转到 Config/Database.php 并设置连接 = mysql,否则某些查询将不起作用,请确保 'strict' = false 只要知道它可能会引起一些安全问题

      【讨论】:

        【解决方案3】:

        使用与您正在处理的查询相关的Eloquent Model

        然后做这样的事情:

        $contactus = ContactUS::select('*')
            ->whereRaw('id IN (SELECT min(id) FROM users GROUP BY email)')
            ->orderByDesc('created_at')
            ->get();
        

        【讨论】:

          【解决方案4】:

          您可以使用hydrate() 函数将您的数组转换为 Eloquent 模型,Laravel 本身在内部 使用该函数将查询结果转换为模型。据我所知,文档中没有提到它。

          以下代码等同于$userModels = User::where('id', '>', $userId)->get();:

          $userData = DB::select('SELECT * FROM users WHERE id > ?', [$userId]);
          $userModels = User::hydrate($userData);
          

          hydrate() 函数在\Illuminate\Database\Eloquent\Builder 中定义为:

          /**
           * Create a collection of models from plain arrays.
           *
           * @param  array  $items
           * @return \Illuminate\Database\Eloquent\Collection
           */
          public function hydrate(array $items) {}
          

          【讨论】:

            【解决方案5】:

            老问题,已经回答了,我知道。

            但是,似乎没有人提到 Expression 类。

            当然,这可能无法解决您的问题,因为您的问题对于需要在 SQL 中的哪个位置包含 Raw 条件(是在 SELECT 语句中还是在 WHERE 语句中?)变得模棱两可。但是,无论如何,您可能会觉得这条信息很有用。

            在您的模型文件中包含以下类:

            use Illuminate\Database\Query\Expression;
            

            然后在Model类里面定义一个新变量

            protected $select_cols = [
                'id', 'name', 'foo', 'bar',
                Expression ('(select count(1) from sub_table where sub_table.x = top_table.x) as my_raw_col'), 'blah'
            ]
            

            并添加范围:

            public function scopeMyFind ($builder, $id) {
                return parent::find ($id, $this->select_cols);
            }
            

            然后从您的控制器或逻辑文件中,您只需调用:

            $rec = MyModel::myFind(1);
            dd ($rec->id, $rec->blah, $rec->my_raw_col);
            

            快乐的日子。

            (在 Laravel 框架 5.5 中工作)

            【讨论】:

              【解决方案6】:

              您可以通过编写来缩短结果处理

              $objects = new Collection(array_map(function($entry) {
                  return (new static())->setRawAttributes((array) $entry, true);
              }, $result));
              

              【讨论】:

                【解决方案7】:

                我不认为你可以默认。我扩展了 Eloquent 并添加了以下方法。

                /**
                 * Creates models from the raw results (it does not check the fillable attributes and so on)
                 * @param array $rawResult
                 * @return Collection
                 */
                public static function modelsFromRawResults($rawResult = [])
                {
                    $objects = [];
                
                    foreach($rawResult as $result)
                    {
                        $object = new static();
                
                        $object->setRawAttributes((array)$result, true);
                
                        $objects[] = $object;
                    }
                
                    return new Collection($objects);
                }
                

                然后你可以这样做:

                class User extends Elegant { // Elegant is my extension of Eloquent
                
                     public static function getWithSuperFancyQuery()
                     {
                         $result = DB::raw('super fancy query here, make sure you have the correct columns');
                         return static::modelsFromRawResults($result);
                     }
                 }
                

                【讨论】:

                • 嗨,当它被固定为 $result = DB::select('这里超级花哨的查询,确保你有正确的列');在 Laravel 5.5 中
                • Eloquent 默认支持这个。几乎任何查询都可以附加单词 raw 以使用原始 SQL。如selectRaw('count(*) as count')whereRaw('1=1')
                【解决方案8】:

                使用DB::statement('your raw query here')。希望这会有所帮助。

                【讨论】:

                • 如果语句是一个选择,这将返回一个布尔值,对于选择子句,使用 DB::select 来获取原始结果数组。
                • 只有在您不期望任何查询输出时才应该使用 DB::statement。
                • 这不是雄辩的
                【解决方案9】:

                你可以试试这个:

                // query can't be select * from table where
                Model::select(DB::raw('query'))->get();
                

                一个例子:

                Model::select(DB::raw('query'))
                     ->whereNull('deleted_at')
                     ->orderBy('id')
                     ->get();
                

                另外,你可以使用类似这样的东西(使用查询生成器):

                $users = DB::table('users')
                                 ->select(DB::raw('count(*) as user_count, status'))
                                 ->where('status', '<>', 1)
                                 ->groupBy('status')
                                 ->get();
                

                另外,您可以尝试这样的事情(使用查询生成器):

                $users = DB::select('select * from users where id = ?', array(1));
                $users = DB::select( DB::raw("select * from users where username = :username"), array('username' => Input::get("username")));
                

                Laravel website 上查看有关Raw-Expressions 的更多信息。

                【讨论】:

                • 这似乎不适用于完整的查询。而且,我使用的是雄辩的东西,而不是数据库。这有关系吗?
                • Eloquent 上,您不能使用完整的原始查询,但您可以使用Query BuilderEloquent 的所有方法。
                • use DB; 如果没有找到数据库
                • 为什么查询不能像select * from table?出于安全原因?
                • @CarloRodríguez 添加use Illuminate\Support\Facades\DB;
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2018-09-12
                • 2012-11-09
                • 1970-01-01
                • 2021-03-22
                • 2019-04-27
                • 2015-04-09
                • 2019-04-29
                相关资源
                最近更新 更多