2015-04-27 2 views
3

Я действительно с трудом преобразовывая этот запрос доктриной:CodeIgniter в Symfony2 с Doctrine2

public function get_order($id) 
{ 
    $this->db->select('*'); 
    $this->db->from('tbl_orderline'); 
    $this->db->join('tbl_order', 'tbl_order.orderNo = tbl_orderline.orderNo'); 
    $this->db->join('tbl_customer', 'tbl_customer.customerNo = tbl_order.customerNo'); 
    $this->db->join('tbl_product', 'tbl_product.productNo = tbl_orderline.productNo'); 
    $this->db->where('tbl_order.orderNo', $id); 

    $query = $this->db->get(); 
    return $query->result_array(); 
} 

Не могли бы вы помочь мне с этим? Любые предложения? Спасибо

+0

Ваши объекты уже сопоставлены? Соотношения, которые вы используете для присоединения, присутствуют в сопоставлении? – Jean

ответ

2
// if you're currently in custom Repository class then: 
$qb = $this->createQueryBuilder('ol'); 

// if you're in a controller, then should be: 
$qb = $em->getRepository('AppBundle:OrderLine')->createQueryBuilder('ol'); // Or whatever your bundle name is. 

// query alias legend: 

// ol - order line 
// o - order 
// c - customer 
// p - product 

// Your query builder should look something like this: 

$qb 
    ->addSelect('o, c, p') 
    ->leftJoin('ol.order', 'o') // this is your relation with [order] 
    ->leftJoin('o.customer', 'c') // this is your relation with [customer] from [order] 
    ->leftJoin('ol.product', 'p') // this is your relation with [product] from [order line] 
    ->where($qb->expr()->eq('ol.id', ':orderLineId') 
    ->setParameter('orderLineId', $id) 
    ->getQuery() 
    ->getOneOrNullResult(); 

Примечание:

Поскольку вы не предоставили каких-либо отображения сущностей, это полностью из синего. Скорее всего, вы захотите изменить свойства в этом запросе, но, по крайней мере, он должен дать вам начало, в котором вы нуждаетесь.

Не стесняйтесь спрашивать, если вы что-то не понимаете.

1

Ive всегда было легче писать прямо dql. Попытка использовать querybuilder для сложных вещей приводит меня в бешенство. Это, очевидно, требует, чтобы у вас были правильные отношения, сопоставленные в ваших сущностях, либо аннотированные, либо с помощью orm-файла.

Очевидно, что его трудно проверить, что Ive поставил ниже, поэтому вам может понадобиться немного отладить.

$query = $this->getEntityManager()->createQuery(
'select orderline, order, customer, product 
from BundleName:tlb_orderline orderline 
join orderline.orderNo order 
join order.customerNo customer 
join orderline.productNo product 
where order.orderNo = :id'); 

$query->setParameter('id' => $id); 

return $query->getResult(); 
+0

Есть ли другие способы? я имею в виду, что я не использую dql с моими кодами, я думаю, что не будет хорошо выглядеть, если я буду смешивать свои коды с dql. – User122113

+0

, но ваше сообщение заголовка говорит, что вы используете doctrine2 (который IS dql)? Теперь у вас есть 2 ответа, используя оба метода. Оба должны выполнять эту работу. – DevDonkey

Смежные вопросы