2013-02-19 13 views
0

我看過其他類似的問題,但沒有一個對我想要做的事情真的有幫助。使用Codeigniter從表中連接一行,並在MySQL中使用另外兩個表的多行

我有三張表; sitesuser_sitessite_domains。我想查詢一個網站以及user_sitessite_domains表中的用戶和域列表。下面是表的一個例子:

db.sites

+------+-------------+---------------------+--------------+ 
| id | site_name | site_options  | created_on | 
+------+-------------+---------------------+--------------+ 
| 1 | name1  | {serialized data} | 10/10/12  | 
+------+-------------+---------------------+--------------+ 
| 2 | name2  | {serialized data} | 24/10/12  | 
+------+-------------+---------------------+--------------+ 
| 3 | name3  | {serialized data} | 08/09/12  | 
+------+-------------+---------------------+--------------+ 
| 4 | name4  | {serialized data} | 03/01/12  | 
+------+-------------+---------------------+--------------+ 
| 5 | name5  | {serialized data} | 10/12/11  | 
+------+-------------+---------------------+--------------+ 

db.user_sites

+------+-----------+-----------+-----------+ 
| id | user_id | site_id | default | 
+------+-----------+-----------+-----------+ 
| 1 | 1   | 1   | 0   | 
+------+-----------+-----------+-----------+ 
| 2 | 3   | 2   | 0   | 
+------+-----------+-----------+-----------+ 
| 3 | 1   | 3   | 0   | 
+------+-----------+-----------+-----------+ 
| 4 | 10  | 1   | 0   | 
+------+-----------+-----------+-----------+ 
| 5 | 5   | 1   | 1   | 
+------+-----------+-----------+-----------+ 

db.site_domains

+------+-----------+-------------------+ 
| id | site_id | site_domain  | 
+------+-----------+-------------------+ 
| 1 | 1   | www.domain1.com | 
+------+-----------+-------------------+ 
| 2 | 1   | sub.domain2.com | 
+------+-----------+-------------------+ 
| 3 | 3   | www.domain3.com | 
+------+-----------+-------------------+ 
| 4 | 2   | www.domain4.com | 
+------+-----------+-------------------+ 
| 5 | 3   | www.domain5.com | 
+------+-----------+-------------------+ 

當它這樣做。我希望能夠像這樣填充對象:

array (
    [1] => array (
     [site_name] => 'Name1', 
     [created_on] => '10/10/12', 
     [site_options] => {serialized data}, 
     [domains] => array (
          [0] => 'www.domain1.com', 
          [1] => 'www.domain2.com' 
         ), 
     [users]  => array (
          [0] => 1, 
          [1] => 10, 
          [2] => 5 
         ) 
    ), 
    [2] => array (
     [site_name] => 'Name2', 
     [created_on] => '24/10/12', 
     [site_options] => {serialized data}, 
     [domains] => array (
          [0] => 'www.domain4.com' 
         ), 
     [users]  => array (
          [0] => 3 
         ) 
    ) 
) 

....等等。

我正在使用Codeigniter來創建我的應用程序,但是如果我只知道它的SQL,我可以將它轉換爲使用Codeigniter。 SQL不是我最大的訴訟,但任何幫助將不勝感激。

回答

-1

我想你會很努力地把這個問題變成一個查詢。

我沒有測試這一點,但這樣的事情可能會給你一些里程:

function get_site_data() { 

    $sites = $this->db->get('sites')->result(); 

    foreach ($sites as &$row) 
    { 
     $row['domains'] = $this->get_domains_for_site($row->id); 
     $row['users'] = $this->get_users_for_site($row->id); 
    } 

    return $sites; 
} 

function get_domains_for_site($site_id) { 
    return $this->db->get_where("site_domains", array("site_id" => $site_id))->result(); 
} 

function get_users_for_site($site_id) { 
    return $this->db->get_where("user_sites", array("site_id" => $site_id))->result(); 
} 
+0

它不這樣做正確的方式 – 2017-12-15 16:34:43

0

如果您使用的ActiveRecord然後交叉表查詢的語法很簡單:

$this->db->select('sites.site_name'); 
$this->db->from('sites'); 
$this->db->join('sites', 'sites.id = user_sites.user_id'); 
$data['query'] = $this->db->get(); 

顯然,這不是準確的查詢,因爲我不知道你在找什麼關係的數據之間,但希望你能明白。

相關問題