Lumen/Laravel 查询生成器二维数组

Lumen/Laravel Query Builder 2D Array

已经研究了几个小时,但似乎做不对。

基本上我有下面的 sql 我正在为我的 API

移动到 Lumen
$data = array();
$query = "SELECT dept.name AS dept_name, r.id AS id, r.name AS role_name FROM careers_dept AS dept INNER JOIN careers_roles AS r ON dept.id = r.dept_id";

$result = mysqli_query($connection, $query);
if($result) {
    while($row = mysqli_fetch_assoc($result)) {
        // read into 2D array
        $row['seoName'] = seoUrl($row['role_name']);
        $data[$row['dept_name']][] = $row;
    }
    $response = json_encode($data);
}
return $response;

这是我目前所拥有的;

$roles = DB::connection('careers')->table('careers_dept')
    ->join('careers_roles', 'careers_roles.dept_id', '=', 'careers_dept.id')
    ->select('careers_roles.id', 'careers_roles.name', 'careers_dept.name')
    ->get();

foreach ($roles as $role) {
    $role->seo = $this->seoUrl($role->name);
}

$data['data'] = $roles;
$data['success'] = true;

$response = json_encode($data);
return $response;

对于初学者来说,我不知道如何像这一行那样正确访问数组的元素

$row['seoName'] = seoUrl($row['role_name']);

两个表都有 name 作为列,但是对于普通的 sql 你可以使用 AS 来给一个别名,这就是我对普通的 sql 所做的。

然后这一行也是我不知道如何转换它。下面的行创建 2D array 使 dept_name 成为父数组。

$data[$row['dept_name']][] = $row;

我还循环遍历数组以获取属性,使用私有函数对其进行转换,然后将其重新注入

foreach ($roles as $role) {
    $role->seo = $this->seoUrl($role->name);
}

这确实有效,但我抓取了错误的 name 属性,因为两个表都有同名的列。

您也可以在 Laravel 查询构建器中使用 AS

 ->select(
      'careers_roles.id', 
      'careers_roles.name as role_name', 
      'careers_dept.name as dept_name'
 )

并且您可以使用 Collection class (https://laravel.com/docs/5.1/collections#method-groupby) 的 groupBy 方法按 dept_name 对结果进行分组。

因此您的最终代码可能如下所示:

$roles = DB::connection('careers')
    ->table('careers_dept')
    ->join('careers_roles', 'careers_roles.dept_id', '=', 'careers_dept.id')
    ->select(
         'careers_roles.id', 
         'careers_roles.name as role_name', 
         'careers_dept.name as dept_name'
    )
    ->get();

foreach ($roles as $role) {
    $role->seo = $this->seoUrl($role->role_name);
}

//convert into collection, group by "dept_name" key and then convert back into array
$data = collect($roles)->groupBy('dept_name')->all();