Как получить таблицу формы записи с другим значением столбца и тем же внешним ключом? - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть три таблицы с именем:

  1. orders * * 1005
  2. orderitems
  3. orderitemattributes

Мне нужно получить запись, где orderitemattribute_name = "OPTION_DATE" и orderitemattribute_value = "01-09-2018" и orderitemattribute_name = "OPTION_SIZE";

Single orderitems имеет множество orderitemattributes записей, таких как: OPTION_DATE, OPTION_SIZE

$rentaldateconstant="OPTION_DATE";

$todaydate="01-09-2018";

$shoesize="OPTION_SIZE";

$query = JFactory::getDbo()->getQuery(true);
$query->select('oi.orderitem_id,oi.orderitem_name,oi.product_id,oi.orderitem_quantity');
$query->select('oi.order_id');
$query->select('oia.orderitemattribute_name,oia.orderitemattribute_value');
$query->from('#__orders AS jo');
$query->leftJoin('#__orderitems AS oi ON oi.order_id=jo.order_id');
$query->leftJoin('#__orderitemattributes AS oia ON oia.orderitem_id=oi.orderitem_id');
$query->where('oia.orderitemattribute_name = '.$db->Quote($rentaldateconstant).' AND oia.orderitemattribute_value ='.$db->Quote($todaydate));
$query->orwhere('oia.orderitemattribute_name = '.$db->Quote($shoesize));

1 Ответ

0 голосов
/ 02 сентября 2018

Похоже, что вы не сохранили свой объект подключения (JFactory::getDbo()). Я включу полный блок try-catch, чтобы показать вам лучшие практики кодирования, которые сэкономят вам много времени в будущем, когда необходима отладка.

Если бы вы написали код для отлова ошибок, с которыми вам бы поступили:

Неустранимая ошибка: вызов функции-члена Quote () для null

Другими словами $db не был определен и был null. Это означает, что quote() не было ресурса для работы.

Предлагаемый / непроверенный код:

$rentaldateconstant="OPTION_DATE";
$todaydate="01-09-2018";
$shoesize="OPTION_SIZE";

$db = JFactory::getDbo();       // you should call this once and use the variable when needed
try {
    $query = $db->getQuery(true)
                ->select(
                      array(
                          "oi.orderitem_id",
                          "oi.orderitem_name",
                          "oi.product_id",
                          "oi.orderitem_quantity",
                          "oi.order_id",
                          "oia.orderitemattribute_name",
                          "oia.orderitemattribute_value"
                      )
                  )
                ->from("#__orders AS jo")
                ->leftJoin("#__orderitems AS oi ON oi.order_id=jo.order_id"
                ->leftJoin("#__orderitemattributes AS oia ON oia.orderitem_id=oi.orderitem_id"
                ->where("oia.orderitemattribute_name = " . $db->q($rentaldateconstant) . " AND oia.orderitemattribute_value = " . $db->q($todaydate))
                ->orwhere("oia.orderitemattribute_name = " . $db->q($shoesize));
    echo $query->dump();  // to see what you've generated (never show to public)
    $db->setQuery($query);
    var_export($db->loadObjectList());  // to see what your resultset looks like as an array of objects
} catch (Exception $e) {
    echo "Syntax Error " , $e->getMessage();   // never show exact error details to public
}

Я также хочу подвергнуть сомнению вашу логику предложения WHERE. Я не знаю, чего требует логика вашего проекта, но это сгенерированное предложение из вашего запроса:

(oia.orderitemattribute_name = 'OPTION_DATE' AND oia.orderitemattribute_value = '01 -09-2018 ') ИЛИ (oia.orderitemattribute_name = 'OPTION_SIZE')

Однако я думаю, что ваша цель - склеить условия вместе с AND.

->where(
      array(
          "oia.orderitemattribute_name = " . $db->q($rentaldateconstant),
          "oia.orderitemattribute_value = " . $db->q($todaydate),
          "oia.orderitemattribute_name = " . $db->q($shoesize)
      )
  )

это генерирует:

WHERE oia.orderitemattribute_name = 'OPTION_DATE'
  AND oia.orderitemattribute_value = '01-09-2018'
  AND oia.orderitemattribute_name = 'OPTION_SIZE'

Наконец, небольшой совет ... При сохранении значений даты в базе данных я рекомендую использовать столбец типа DATE и сохранить значения как YYYY-MM-DD, чтобы в будущем вам было проще запрашивать / манипулировать данными .

...