0

「id」と「step」という名前のステップのテキストを含む「steps」テーブルがあります。次に、「id」とその他の顧客情報を含む「顧客」テーブルがあります。最後に、「customer_id」と「step_id」を持つ「customers_steps」結合テーブルがあります。目標は、ステップのリストを作成し、どのステップが完了したかを示すことです。しかし、私は立ち往生しています...

何も見逃していないことを確認するために、「顧客」モデルでは、

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;
   }
}

これは機能します...しかし、それを改善するにはどうすればよいですか? 前もって感謝します。

4

2 に答える 2

1

多対多の関係があるため、これを一度に行うことはできません。

理想的には、steps と 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());
于 2010-12-21T23:03:14.447 に答える
0

別のケースでは、私は多対多の関係がそれほど単純ではないことを発見しました。多分、私はあまりにも多くの魔法を求めています。

例えば

顧客has_many連絡先has_manyアドレス。

Contacts_CustomersテーブルとAddresses_Contactsテーブルには、primary=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 addresss_contacts.primary=1だけでした。

于 2011-09-22T16:14:27.613 に答える