代码之家  ›  专栏  ›  技术社区  ›  Jaquarh

如何在laravel中获取查询生成器结果的所有列的数组?

  •  0
  • Jaquarh  · 技术社区  · 5 年前

    我正在尝试获取动态创建的表的列。我看着 this question 以查找如何获取列。

    \DB::getSchemaBuilder()->getColumnListing(\DB::table('product_list')
        ->join('product_categories', 'product_list.product_category', '=', 'product_categories.id')
        ->join('product_types', 'product_list.product_type', '=', 'product_types.id')
        ->where('product_list.id', $this->id)
        ->orderBy('product_list.id', 'DESC')
        ->get()
    );
    

    然而,这给了我一个输出 [] . 如果我在不封装命令的情况下运行命令 \DB::getSchemaBuilder()->getColumnListing() 我明白这一点:

    Collection {#652 ▼
      #items: array:1 [▼
        0 => {#650 ▼
          +"id": 3
          +"cost": "150.00"
          +"product_category": 1
          +"product_type": 3
          +"product_score": 0
          +"created_at": "2019-01-16 16:34:29"
          +"updated_at": "2019-01-16 16:34:29"
          +"rating": 0
          +"down_payment": "10.00"
          +"title": "Static"
          +"price_start": "50.00"
          +"price_stop": "150.00"
          +"theme": "Custom"
          +"pages": 4
          +"rbac": 0
          +"portal": 0
          +"external_software": 0
          +"company_supplier": "Iezon Solutions"
        }
      ]
    }
    

    如何获取所有列的数组?

    2 回复  |  直到 5 年前
        1
  •  1
  •   Eden Reich    5 年前

    如果只需要动态创建的表列名,快速解决方案是:

    array_keys(get_object_vars($collection->first())); // will output ['id', 'cost', 'product_category', ...]
    
        2
  •  0
  •   Jaquarh    5 年前

    这可能是迄今为止使用的最糟糕的解决方案,但我没有时间搜索收集文档,以找到更好的方法来执行此操作,或者使用Laravel功能的方式。

    我决定把它改成 toArray() ,使用第一个索引 [0] 并将其强制转换为数组。这样我就可以使用 array_keys() 查找列名称。

    array_keys((array) \DB::table('product_list')->join('product_categories', 'product_list.product_category', '=', 'product_categories.id')
                ->join('product_types', 'product_list.product_type', '=', 'product_types.id')
                ->where('product_list.id', $this->id)
                ->orderBy('product_list.id', 'DESC')->get()->toArray()[0])