【问题标题】:CodeIgniter Active Record For Joining The Tables用于加入表的 CodeIgniter 活动记录
【发布时间】:2014-02-04 09:43:10
【问题描述】:

我有以下表格。

       apartments
       id name slug created modified

       apartment_amenities
       id name slug apartment_id created modified

       apartment_activities
       id name slug apartment_id created modified

在视图中我想要这样的东西。

       no apartment_name    amenities       activities

       1  shobha_comnplex   party hall      pamplets
                            swimming pool   banners
                            play area       boards

       2  navami_comnplex   party hall      boards
                            swimming pool   banners
                            club house      pamplets

在我尝试过的模型中。

        $this->db->select('apartments.id, apartments.slug, apartments.name, apartment_amenities.name as amenity_name, apartment_activities.name as activity_name');
        $this->db->from($this->_table);
        $this->db->join('apartment_amenities', 'apartment_amenities.apartment_id = apartments.id', 'left');
        $this->db->join('apartment_activities', 'apartment_activities.apartment_id = apartments.id', 'left'); 
        return $this->db->get();

但即使公寓有许多便利设施和活动,我也只能得到单一的便利设施和活动。结果如下。

Array
(
    [0] => 
        (
            [id] => 1
            [slug] => shobha_complex
            [name] => shobha complex
            [amenity_name] => party hall
            [activity_name] => pamplets
        ),

    [1] => 
        (
            [id] => 1
            [slug] => navami_complex
            [name] => navami complex
            [amenity_name] => party hall
            [activity_name] => boards
        )
)

我想要的结果如下。

    Array
    (
        [0] => 
            (
                [id] => 1
                [slug] => shobha_complex
                [name] => shobha complex
                [amenities] => Array(
                    [0] => 
                         (
                            [name] => party hall
                         ),
                    [1] => 
                         (
                            [name] => swimming pool
                         ),
                    [2] => 
                         (
                            [name] => play area
                         )
                ),
                [activities] => Array(
                    [0] => 
                         (
                            [name] => pamplets
                         ),
                    [1] => 
                         (
                            [name] => banners
                         ),
                    [2] => 
                         (
                            [name] => boards
                         )
                )
            ),

        [1] => 
            (
                [id] => 1
                [slug] => navami_complex
                [name] => Navami complex
                [amenities] => Array(
                    [0] => 
                         (
                            [name] => party hall
                         ),
                    [1] => 
                         (
                            [name] => swimming pool
                         ),
                    [2] => 
                         (
                            [name] => club house
                         )
                ),
                [activities] => Array(
                    [0] => 
                         (
                            [name] => boards
                         ),
                    [1] => 
                         (
                            [name] => banners
                         ),
                    [2] => 
                         (
                            [name] => pamplets
                         )
                )
            ),
    )

请建议我如何获得解决方案。这项工作将受到更多赞赏。

【问题讨论】:

    标签: codeigniter activerecord join codeigniter-2


    【解决方案1】:

    您可以在您的选择中使用组 concat 并用作分隔符 |所以你只会得到两行,并在你的视图中用分隔符拆分列

    $this->db->select("GROUP_CONCAT(partment_amenities.name SEPARATOR '|') as amenity_name, ...... ", FALSE);
    

    第二个参数 FALSE 表示不保护标识符 有关组连接的更多信息,请参见链接: https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

    【讨论】:

      【解决方案2】:

      删除$this->db->group_by 方法调用。 这只会为每间公寓返回一个结果。如果你删除它,你应该得到你想要的所有便利等等。

      唯一的问题是你得到这样的结果

         no apartment_name    amenities       activities
      
         1  shobha_comnplex   party hall      pamplets
         1  shobha_comnplex   swimming pool   banners
         1  shobha_comnplex   play area       boards
      
         2  navami_comnplex   party hall      boards
         2  navami_comnplex   swimming pool   banners
         2  navami_comnplex   club house      pamplets
      

      【讨论】:

        【解决方案3】:

        要设置正确的阵列,以您寻找的格式,我建议您使用一些模型。

        让我们设置一个场景

        控制器:

        $apartments = $this->apartment_model->getApartments(); // Get All Apartments
        foreach($apartments as &$apartment)
        {
          $apartment->amenities = $this->apartment_model->getAmenities($apartment->id);
          $apartment->activities= $this->apartment_model->getActivities($apartment->id);
        
          // Add / Modify any addition properties
        }
        
        // Do something with the $apartments array
        

        型号:

        class Apartment_model extends model
        {
          function getApartments()
          {
            $this->db->select('id, slug, name');
            $this->db->from('apartments');
            $query = $this->db->get();
            return $query->result();
          }
          function getAmenities($apartment_id)
          {
            $this->db->select('name');
            $this->db->from('apartment_amenities');
            $this->db->where('id', $apartment_id);
            $query = $this->db->get();
            return $query->result();
          }
          function getActivities($apartment_id)
          {
            $this->db->select('name');
            $this->db->from('apartment_activities');
            $this->db->where('id', $apartment_id);
            $query = $this->db->get();
            return $query->result();
          }
        }
        

        当然请记住,这不会加载视图或将您的数据移动到控制器之外的任何位置,但它至少会设置数组。

        我希望这可以帮助您入门。

        【讨论】:

          猜你喜欢
          • 2023-03-06
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-08
          • 1970-01-01
          相关资源
          最近更新 更多