Datamapper ORM / CodeIgniter - использование и отображение таблиц соединений - PullRequest
0 голосов
/ 21 декабря 2010

У меня есть таблица «steps» с «id» и текстом шага с именем «step». Тогда у меня есть таблица "клиенты" с "id" и другой информацией о клиенте. Наконец, у меня есть таблица соединений «customer_steps» с «customer_id» и «step_id». Цель состоит в том, чтобы иметь список шагов и показать, какие из них были выполнены. Но я застрял ...

Чтобы убедиться, что я ничего не пропустил, в модели "клиент" у меня есть

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

Это работает ... но что я могу сделать, чтобы сделать его лучше? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 22 декабря 2010

У вас есть отношение многие ко многим, поэтому вы никогда не сможете сделать это за один раз.

В идеале, вам нужно СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ между шагами и customer_steps, которое приведет к набору результатовсо всеми шагами в нем и значением 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 голосов
/ 22 сентября 2011

В другом случае я обнаружил, что многие отношения не так просты. Может быть, я прошу слишком много магии.

Е.Г.

Клиенты 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();

Кроме того, не работал.

В итоге я использовал функцию в модели для фильтрации первичных нулей. Хотелось бы, чтобы один из вышеперечисленных работал, хотя. Что касается самой команды SQL, то все, что мне нужно, это еще один WHERE address_contacts.primary = 1.

...