2010-12-20 35 views
0

我有一個「步驟」表,其中包含「id」和名爲「step」的步驟的文本。然後我有一個「客戶」表「ID」和其他客戶信息。最後,我有一個「customers_steps」連接表,其中包含「customer_id」和「step_id」。目標是要有一個步驟列表,並顯示哪些已完成。但我堅持......Datamapper ORM/CodeIgniter - 使用和顯示連接表

爲了確保我不會遺漏任何東西,在「客戶」的模式,我有

var $has_many = array ('step'); 

在「步」的模式,我有

var $has_many = array('customer'); 

現在,我正在循環步驟,然後循環遍歷客戶的步驟,以查看它們是否匹配...但是它有很多代碼,我知道必須有更快的方法,而且我只是想念它:

$c = new Customer(); 
$c->get_by_id(1); 
$c->step->get(); 
$s = new Step(); 
$s->get(); 
foreach($s as $step) 
{ 
    foreach($c as $customer) 
    { 
     if($customer->step->id == $step->id) 
     { 
     $match = true; 
     } 
    } 
    if($match) 
    { 
    echo "match - " . $step->step; 
    } 
    else 
    { 
    echo $step->step; 
    } 
} 

這有效......但我能做些什麼來改善它?提前致謝。

回答

1

你有多對多的關係,所以你永遠無法一次做到這一點。

理想情況下,您需要在步驟和customers_steps之間使用LEFT JOIN,這將生成包含所有步驟的結果集,並且對於特定客戶ID而言不存在這些步驟的NULL值。但是由於Datamapper是關於關係的,它不能報告那些不存在的關係。

你可以使用

// get the customer and his steps 
$c = new Customer(1); 
$c->step->get(); 

// create the list of assigned step id's 
$list = array(); 
foreach ($c->step as $step) 
{ 
    $list[] = $step->id; 
} 

// get the steps not assigned 
$s = new Step(); 
$s->where_not_in('id', $list); 

// at this point $c->steps contains all matching steps 
// and $s all steps that don't match 
print_r($c->steps->all_to_array()); 
print_r($s->all_to_array()); 
+0

非常感謝!我可能會繼續按照目前的方式進行操作,但我認爲可能存在我缺少的Datamapper方法。但是這回答了我的問題。再次感謝! – TerryMatula 2010-12-22 14:56:46

0

在不同的情況下,我發現有很多很多的關係並非如此簡單。也許,我要求太多魔法。

E.G.

客戶has_many聯繫人has_many地址。

Contacts_Customers和Addresses_Contacts表有一列主= 0或1

我不能夠得到所有客戶的全表,原發性接觸和主要地址。

我可以讓他們與主要聯繫人。當我使用第二個「where_join_field」時不起作用。也許我失去了一些東西......

我想

$c = new Customer(); 
$c->include_related('contact'); 
$c->where_join_field('contact','primary','1'); 
$c->include_related('contact/address'); 
$c->where_join_field('contact/address','primary','1'); 
$c->get(); 

沒有工作。

$c = new Customer(); 
$c->include_related('contact'); 
$c->where_join_field('contact','primary','1'); 
$c->contact->include_related('address'); 
$c->contact->where_join_field('address','primary','1'); 
$c->get(); 

另外,沒有工作。

我最終在模型中使用了一個函數來過濾掉主0。雖然會喜歡上述其中之一。至於實際的SQL命令,我只想要另一個WHERE addresses_contacts.primary = 1.