在laravel中将对象转换为数组

8yt*_*0d3 3 php arrays object type-conversion laravel

我查询了一个这样的数据库,它让我得到了一个数组:

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;
Run Code Online (Sandbox Code Playgroud)

这是我得到的数组

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)
Run Code Online (Sandbox Code Playgroud)

我试图在表单中获取此数组

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)
Run Code Online (Sandbox Code Playgroud)

我试过这样做:

foreach($orderdetailData as $key => $value){
    $data[] = array_flatten($orderdetailData[$key]);
}
Run Code Online (Sandbox Code Playgroud)

但这样做会让我得到一个这种形式的数组:

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)
Run Code Online (Sandbox Code Playgroud)

这不是我想要的.有人能告诉我这是一个简单的方法吗?谢谢

luk*_*ter 8

使用array_map和转换为数组应该足够了:

$data = array_map(function($object){
    return (array) $object;
}, $data);
Run Code Online (Sandbox Code Playgroud)

我也不会在循环中运行查询.您应该尝试从db中的一个查询中获取该数据.像这样的东西可以工作:

$data = DB::table('order_details')
    ->join('orders', 'order_details.oid', '=', 'orders.oid')
    ->select('order_details.oid', 'orders.ostatus')
    ->whereIn('order_details.oid', $oid)->get();
Run Code Online (Sandbox Code Playgroud)

编辑

正如在另一个答案中提到的那样,让我解释一下如何通过将PDO设置为FETCH_ASSOC:

DB::setFetchMode(PDO::FETCH_ASSOC);
$data = DB::table('order_details') .... ->get();
Run Code Online (Sandbox Code Playgroud)

但是,这会为请求的其余部分全局更改提取模式(至少如果您不打开新连接).要保存,您应该在以后更改它:

DB::setFetchMode(PDO::FETCH_ASSOC);
$data = DB::table('order_details') .... ->get();
DB::setFetchMode(PDO::FETCH_CLASS);
Run Code Online (Sandbox Code Playgroud)

如果你不能确定使用什么默认值,甚至可以先备份它:

$fetchModeBefore = DB::getFetchMode();
DB::setFetchMode(PDO::FETCH_ASSOC);
$data = DB::table('order_details') .... ->get();
DB::setFetchMode($fetchModeBefore);
Run Code Online (Sandbox Code Playgroud)