laravel怎么把对象转换为数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了laravel怎么把对象转换为数组相关的知识,希望对你有一定的参考价值。
当构建 JSON API 时,您可能常常需要把模型和关联对象转换成数组或JSON。所以Eloquent里已经包含了这些方法。要把模型和已载入的关联对象转成数组,可以使用 toArray方法:$user = User::with('roles')->first();
return $user->toArray();
注意:也可以把整个的模型集合转换成数组:
return User::all()->toArray();
将模型转换成 JSON
要把模型转换成 JSON,可以使用 toJson 方法:
return User::find(1)->toJson();
从路由中返回模型
注意当模型或集合被转换成字符串类型时会自动转换成 JSON 格式,这意味着您可以直接从路由返回 Eloquent 对象!
Route::get('users', function()
return User::all();
); 参考技术A toArray()是5.0之前能用吧?
5.0之后可以用
array_map('get_object_vars', $data);
在laravel中将对象转换为数组[重复]
【中文标题】在laravel中将对象转换为数组[重复]【英文标题】:Converting object to array in laravel [duplicate] 【发布时间】:2015-04-23 21:32:32 【问题描述】:我查询了这样的数据库,得到了一个数组:
foreach($oid as $orderid)
$orderdetailData[] = DB::table('order_details')
->join('orders', 'order_details.oid', '=', 'orders.oid')
->select('order_details.oid', 'orders.ostatus')
->where('order_details.oid', $orderid)->get();
$data = array_flatten($orderdetailData);
return $data;
这是我得到的数组
array (size=2)
0 =>
object(stdClass)[174]
public 'oid' => int 1
public 'ostatus' => string 'Placed' (length=6)
1 =>
object(stdClass)[158]
public 'oid' => int 2
public 'ostatus' => string 'Placed' (length=6)
我正在尝试以表格形式获取此数组
array (size=2)
0 =>
array (size=2)
public 'oid' => int 1
public 'ostatus' => string 'Placed' (length=6)
1 =>
array (size=2)
public 'oid' => int 2
public 'ostatus' => string 'Placed' (length=6)
我试过这样做:
foreach($orderdetailData as $key => $value)
$data[] = array_flatten($orderdetailData[$key]);
但是这样做会得到一个这种形式的数组:
array (size=2)
0 =>
array (size=1)
0 =>
object(stdClass)[174]
public 'oid' => int 1
public 'ostatus' => string 'Placed' (length=6)
1 =>
array (size=1)
0 =>
object(stdClass)[158]
public 'oid' => int 2
public 'ostatus' => string 'Placed' (length=6)
这不是我想要的。有人能告诉我这样做的简单方法是什么吗?谢谢
【问题讨论】:
您可以查看SO question的解决方案。它解释了如何将对象转换为数组。 【参考方案1】:使用array_map
并强制转换为数组就足够了:
$data = array_map(function($object)
return (array) $object;
, $data);
我也不会在循环中运行查询。您应该尝试从数据库的一个查询中获取该数据。像这样的东西可以工作:
$data = DB::table('order_details')
->join('orders', 'order_details.oid', '=', 'orders.oid')
->select('order_details.oid', 'orders.ostatus')
->whereIn('order_details.oid', $oid)->get();
编辑
正如在另一个答案中提到的那样,让我解释一下如何通过将 PDO 设置为 FETCH_ASSOC
来完成同样的任务:
DB::setFetchMode(PDO::FETCH_ASSOC);
$data = DB::table('order_details') .... ->get();
但是,这会更改请求其余部分的全局获取模式(至少在您不打开新连接的情况下)。为了保存,您应该在之后将其更改回来:
DB::setFetchMode(PDO::FETCH_ASSOC);
$data = DB::table('order_details') .... ->get();
DB::setFetchMode(PDO::FETCH_CLASS);
如果您不确定使用的是什么默认值,甚至可以先备份它:
$fetchModeBefore = DB::getFetchMode();
DB::setFetchMode(PDO::FETCH_ASSOC);
$data = DB::table('order_details') .... ->get();
DB::setFetchMode($fetchModeBefore);
【讨论】:
array_map() 有效。感谢回复,今天学到了新东西:) 谨防由此带来的性能缺陷。 我试图直接从对象中获取值,但出现“无法使用 MyClass 类型的对象作为数组”错误如何直接从类中获取值【参考方案2】:在 PDO/DB 对象上,您可以将返回样式设置为 assoc。
【讨论】:
现在试试这个:) 感谢您的回复以上是关于laravel怎么把对象转换为数组的主要内容,如果未能解决你的问题,请参考以下文章