将 Laravel 查询结果转换为类截至 5.4
当使用语法创建查询时,它会创建一个泛型类(stdClass)。有没有办法将生成的行强制转换为特定类?DB::table('foo')
下面是一些示例代码,应该解释我想要做什么:
$result = DB::table('foo')->get();
$converted = (Foo) $result; // Not going to work
我想将数组的所有(stdClass)对象强制转换为Foo类。
当使用语法创建查询时,它会创建一个泛型类(stdClass)。有没有办法将生成的行强制转换为特定类?DB::table('foo')
下面是一些示例代码,应该解释我想要做什么:
$result = DB::table('foo')->get();
$converted = (Foo) $result; // Not going to work
我想将数组的所有(stdClass)对象强制转换为Foo类。
是的,您可以将结果水合到所需的类中。我发现答案深埋在一堆混乱的半答案和混乱的问题中,构成了可怕的 Laracasts.com 论坛。感谢您在这里而不是在那里提出问题。
获得结果后,使用模型类对它们进行水合:
$result = DB::table('foo')->get();
$converted = Foo::hydrate($result);
编辑:也找到了一些关于水合物
方法的文档,如果这有帮助的话
编辑 2:我发现自己处于这样一种情况,即我需要根据查询结果从 an 或 a 转换结果。当返回集合时,它被正确水合,但是当结果是数组时,它们只是 。我编写了一个添加到我的母版的快速方法,该方法获取数组或对象的集合,或分页对象,并将其正确转换为我想要的对象。array
collection
stdClass
model
雄辩的模型没有hydrate()方法。
这已被移动到雄辩构建器类。
https://laravel.com/api/5.4/search.html?search=hydrate
以下是我在一些 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();