我有3张表 - celebs
,celeb_roles
,celeb_industry
celebs
是与其他2个表有一对多关系的主表。
celebs
有列 -
身份,姓名,国籍,身份。
celebs_roles
有列 -
id,celeb_id,role_id。
celebs_industry
有列 -
id,celeb_id,industry_id。
角色和行业数量有限且固定。所以我把它们放在一个id=>value
对的配置文件中。因此,如果我从结果中获得role_id
,我可以从配置文件中获取值。同样适用于industry_id
。
现在,为了从一个给定的ID中获取名人详细信息,我在模型中编写了如下所示的查询。
public function getCelebSingle($celebId)
{
$this->db->select('*');
$this->db->from('celebs');
$this->db->join('celebs_roles', 'celebs_roles.celeb_id = celebs.id');
$this->db->join('celebs_industry', 'celebs_industry.celeb_id = celebs.id');
$this->db->where('celebs_roles.celeb_id', $celebId);
$this->db->where('celebs_industry.celeb_id', $celebId);
$query = $this->db->get();
return $query->result_array();
}
在数据库中,celebs
中有一条记录,同一个celeb_id在其他2个表中的每一个中都有2条记录。
我得到的结果如下。
Array
(
[0] => Array
(
[id] => 1
[name] => new test
[nationality] => whatever
[status] => Pending
[celeb_id] => 1
[role_id] => 1
[industry_id] => 1
)
[1] => Array
(
[id] => 1
[name] => new test
[nationality] => whatever
[status] => Pending
[celeb_id] => 1
[role_id] => 3
[industry_id] => 1
)
[2] => Array
(
[id] => 2
[name] => new test
[nationality] => whatever
[status] => Pending
[celeb_id] => 1
[role_id] => 1
[industry_id] => 2
)
[3] => Array
(
[id] => 2
[name] => new test
[nationality] => whatever
[status] => Pending
[celeb_id] => 1
[role_id] => 3
[industry_id] => 2
)
)
因此,对于celebs
表的一个记录,我需要把它放在一个循环中,我认为这有点过载。如果其他2个表中的记录数增加,则结果数组中的项也将增加。所以我想知道,我能得到类似下面的结果吗?
Array
(
[0] => Array
(
[id] => 1
[name] => new test
[nationality] => whatever
[status] => Pending
[celeb_roles] => array(
[0] => Array
(
[id] => 1
[celeb_id] => 1
[role_id] => 1
)
[0] => Array
(
[id] => 1
[celeb_id] => 1
[role_id] => 2
)
)
[celeb_industry] => array(
[0] => Array
(
[id] => 1
[celeb_id] => 1
[industry_id] => 1
)
[0] => Array
(
[id] => 1
[celeb_id] => 1
[industry_id] => 2
)
)
)
)
这只是结果数组的期望,但我不知道如何实现这个结果数组。有人可以看一下吗?
以下是可能重复的内容 - Codeigniter group by and create multidimensional array。但答案并不令人满意。答案清楚地说明不使用JOIN,而是使用正常的Codeigniter get查询,我认为这将导致3个问题查询。如果我选择celebs
表的所有记录怎么办?然后,查询的数量将为3 * Number of records in celebs table
,这将超载。如果没有别的办法,我只能这样做,但我希望有更好的方法来做到这一点。
答案 0 :(得分:2)
请这样做,我不确定这是对的,但如果你想在期望数组中声明结果,你需要尝试这种方式。
$this->db->select('*');
$this->db->from('celebs');
$this->db->join('celebs_roles', 'celebs_roles.celeb_id = celebs.id');
$this->db->join('celebs_industry', 'celebs_industry.celeb_id = celebs.id');
$this->db->where('celebs_roles.celeb_id', $celebId);
$this->db->where('celebs_industry.celeb_id', $celebId);
$query = $this->db->get();
$result = $query->result_array();
$new_array = array();
foreach ($result as $key => $value){
$new_array = $value;
foreach ($result as $key1 => $value1){
$new_array['celeb_roles'][$key1]['id'] = $value1['id'];
$new_array['celeb_roles'][$key1]['celeb_id'] = $value1['celeb_id'];
$new_array['celeb_roles'][$key1]['role_id'] = $value1['role_id'];
}
}