Codeigniter从模型中获取一对多关系并在视图中解析

时间:2016-05-23 17:31:55

标签: database codeigniter model

我有3张表 - celebsceleb_rolesceleb_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,这将超载。如果没有别的办法,我只能这样做,但我希望有更好的方法来做到这一点。

1 个答案:

答案 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'];
            }

    }