2010-12-20 9 views
0

"ステップ"テーブルの "id"と "step"という名前のステップのテキストがあります。次に、私は "id"と他の顧客情報を持つ "顧客"テーブルを持っています。最後に、 "customers_id"と "step_id"を持つ "customers_steps"結合テーブルがあります。目標はステップのリストを作成し、どのステップが完了したかを示すことです。しかし、私は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

あなたは多対多の関係を持っているので、一度にこれを行うことはできません。

理想的には、stepsとcustomers_stepsの間にLEFT JOINが必要です。すべてのステップを含む結果セットを生成するcustomers_stepsと、特定のcustomer 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

0

を使用することができ、私は多くの関係に多くはそう簡単ではない発見しました。たぶん、私はあまりにも多くの魔法を求めています。

E.G.

お客様has_many連絡先has_manyアドレス。

Contacts_CustomersとAddresses_Contactsテーブルは= 0または1

列の主を持っている私は、主に接触し、プライマリアドレスで、すべての顧客の完全なテーブルを取得することはできませんよ。

私は主な連絡先でそれらを得ることができます。 2番目の "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でした。

関連する問題