Применить левое соединение, чтобы извлечь данные из нескольких таблиц, используя их внешний ключ - PullRequest
0 голосов
/ 22 июня 2011

У меня есть таблица TblOrders, которая имеет два поля, такие как FldOrderStatusId и FldInstrumentID, как внешний ключ из таблиц с именами TblOrderStatus и TblInstrumentMasters соответственно. Возможно ли оставить соединение за столом. Код приведен ниже:

$find_filled_orders = $this->UserOrder->query(
    "Select distinct(FldOrderNumber) from TblOrders where FldOrderStatusId =12 ");
$res_order="";
$i=0;
foreach($find_filled_orders as $order_arr)
{
    if($i!=0)
    {
        $res_order.=",";
    }
    $res_order.="'".$order_arr['TblOrders']['FldOrderNumber']."'";
    $i++;               
 }
 $where_not_in="";
 if($i>=1)
 {              
     $where_not_in =  "AND FldOrderNumber NOT IN (".$res_order.")";
 }
 //debugbreak(); 
 $current_order = $this->UserOrder->query(
     "Select * from TblOrders where 1 ".$where_not_in.
     " group by FldOrderNumber order by FldSlNo  desc"); 

Я хочу применить левое соединение к последней строке запроса. Пожалуйста, ребята, помогите мне. Заранее спасибо.

1 Ответ

2 голосов
/ 22 июня 2011

Вы уверены, что используете Cake? O_o Для такого простого запроса нет необходимости в raw sql. Если ваши таблицы и имена ключей следуют соглашениям Cake, Cake сделает все это за вас с помощью пары методов в вашем контроллере.

Я даже не совсем уверен, чего вы пытаетесь достичь, но я думаю, что вы просто хотите получить все статусы всех незаполненных ордеров пользователя или что-то еще?

Существует ровно 0 необходимости вручную создавать запросы в Cake, не говоря уже о таких строках. Позвольте каркасу сделать тяжелую работу. При необходимости $ find_filled_orders можно записать как вложенный оператор SELECT (для которого Cake предоставляет элегантную поддержку). В противном случае все, что вам нужно, - это переоборудование ваших таблиц / моделей, чтобы вы могли правильно связать их и позволить Cake сделать все остальное.

Вы не показываете, как вы хотите называть инструменты, поэтому я не могу быть более конкретным. Но Cake будет автоматически генерировать объединения для связанных моделей, если вы определите их и назовете все правильно. Подразумевайте связь между Заказами и Пользователями, добавив в Заказы столбец с именем user_id. То же самое для instruments_id и status_id, и, если необходимо, для таблицы Users - order_id и т. Д. Для столбцов «внешнего ключа» торта фактически не нужно определять внешний ключ, ограниченный в БД, или даже содержать какие-либо данные. Сделайте их все нулевыми, если вам нравится.

$current_order = $this->Order->find('all', array(
    'conditions'=>array(
        'Order.status_id != 12',
        'Order.status_id'=>'Status.id', 
        'Order.instrument_id'=>'Instrument.id'
        ),
    'fields'=>array('DISTINCT (Order.number) as number', 'name', 'other'),
    'group'=> 'Order.number',
    'order'=>'Order.fld_sl_no DESC'
    )
);

(И группа, и DISTINCT - в реальной жизни не нужно ни того, ни другого. Я помещаю их обоих ради демонстрации.)

http://book.cakephp.org/view/1002/Creating-Database-Tables

http://book.cakephp.org/view/1030/Complex-Find-Conditions

НТН. :)

...