Pregunta

Tengo una mesa de "pasos", con el "ID" y el texto del paso llamado "paso". Entonces tengo una tabla "clientes" con "id" y otra información al cliente. Por último, tengo un "customers_steps" tabla de unión con "customer_id" y "step_id". El objetivo es tener una lista de pasos, y mostrar cuáles fueron terminadas. Pero estoy atascado ...

Para asegurarse de que no me falta nada, en el modelo de "cliente", tengo

var $has_many = array ('step');

En el modelo de "paso", tengo

var $has_many = array('customer');

En este momento, estoy en bucle los pasos, a continuación, bucle a través de los pasos del cliente para ver si coinciden ... pero es una gran cantidad de código, y sé que tiene que haber una manera más rápida, y estoy solo falta que:

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

Este obras ... pero ¿qué puedo hacer para que sea mejor? Gracias de antemano.

¿Fue útil?

Solución

Usted tiene una relación de muchos a muchos, por lo que nunca será capaz de hacer esto de una vez.

Lo ideal es que se necesita un LEFT JOIN entre los pasos y customers_steps, que producirían un conjunto de resultados con todas las medidas en él, y un valor NULL para esos pasos no están presentes para un ID de cliente específico. Pero desde DataMapper es acerca de las relaciones, no puede informar de relaciones que no están allí.

Se puede usar

// 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());

Otros consejos

En un caso diferente, he encontrado a muchos a muchas relaciones no tan sencillo. Tal vez, lo que estoy pidiendo demasiada magia.

por ejemplo.

Las direcciones de clientes has_many Contactos has_many.

Contacts_Customers y Addresses_Contacts tablas tienen una columna primaria = 0 o 1.

No soy capaz de conseguir una mesa llena de todos los clientes, con el contacto principal y las direcciones principales.

Me puede conseguir con los contactos primarios. No funciona cuando se utiliza un segundo "where_join_field". Tal vez me falta algo ...

quería

$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();
No

funcionó.

$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();

Además, no funcionaba.

Terminé usando una función dentro del modelo para filtrar los 0s primarios. Me hubiera gustado tener uno de los anteriores al trabajo sin embargo. En cuanto a la orden real de SQL, lo único que quería era otra DONDE addresses_contacts.primary = 1.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top