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();
已经研究了几个小时,但似乎做不对。
基本上我有下面的 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();