将 Laravel 查询结果转换为类截至 5.4

2022-08-30 17:41:47

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

下面是一些示例代码,应该解释我想要做什么:

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

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


答案 1

是的,您可以将结果水合到所需的类中。我发现答案深埋在一堆混乱的半答案和混乱的问题中,构成了可怕的 Laracasts.com 论坛。感谢您在这里而不是在那里提出问题。

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

$result = DB::table('foo')->get();
$converted = Foo::hydrate($result);

编辑:也找到了一些关于水合物方法的文档,如果这有帮助的话

编辑 2:我发现自己处于这样一种情况,即我需要根据查询结果从 an 或 a 转换结果。当返回集合时,它被正确水合,但是当结果是数组时,它们只是 。我编写了一个添加到我的母版的快速方法,该方法获取数组或对象的集合,或分页对象,并将其正确转换为我想要的对象。arraycollectionstdClassmodel


答案 2

截至 5.4

雄辩的模型没有hydrate()方法。

这已被移动到雄辩构建器类。

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();

推荐