将Laravel查询结果转换为类

Osk*_*D90 19 php laravel eloquent laravel-5

使用语法创建查询时DB::table('foo'),它会创建一个泛型类(stdClass).有没有办法将结果行强制转换为特定的类?

以下是一些示例代码,可以解释我想要做的事情:

$result = DB::table('foo')->get();
$converted = (Foo) $result; // Not going to work
Run Code Online (Sandbox Code Playgroud)

我想将数组的所有(stdClass)对象强制转换为Foo类.

dKe*_*Ken 31

是的,您可以将结果保存到您想要的类中.我发现答案深深埋藏在一堆半答案和混乱的问题中,组成了可怕的Laracasts.com论坛.谢谢你在这里提问而不是那里.

获得结果后,使用您的模型类对它们进行水合:

$result = DB::table('foo')->get();
$converted = Foo::hydrate($result);
Run Code Online (Sandbox Code Playgroud)

编辑:如果有帮助的话,也可以找到关于该hydrate方法的一些文档

编辑2:我发现自己处于一种情况,我需要根据查询结果从一个array或一个转换collection结果.当一个集合被返回时,它被正确地水合,但是当结果是一个数组时,它们就是stdClass.我写了一个快速方法添加到我的主人model,它采用了一组数组或对象,或一个分页对象,并正确地将其转换为我想要的对象.


Bee*_*eff 5

从 Laravel 5.4 开始

Eloquent 模型没有 hydrate() 方法。

这已移至 Eloquent Builder 类。

https://laravel.com/api/5.4/search.html?search=hydrate

Eloquent Builder 类需要一些东西来手动工作

  1. 要初始化的查询构建器
  2. 一个水合模型。

这是我在一些 Laravel 5.8 代码中的工作示例:

            $instance = new $class;
            $table = $instance->getTable();

            
            $eloquent_builder = new \Illuminate\Database\Eloquent\Builder(
                // the Query Builder!
                DB::connection($connection_name)
                ->table($table)
                ->select($columns)
                ->orderBy($order_by, $order)
            );
            

            // Tell Eloquent what you're using to hydrate the query
            $eloquent_builder->setModel($instance);


            return $eloquent_builder->get();
Run Code Online (Sandbox Code Playgroud)