如何获取具有不同列值和相同外键的记录表格?

时间:2018-09-01 06:56:41

标签: php joomla database-connection

我有三个表,分别为:

  1. orders
  2. orderitems
  3. orderitemattributes

我需要获取orderitemattribute_name = "OPTION_DATE"orderitemattribute_value = "01-09-2018"orderitemattribute_name = "OPTION_SIZE"的记录;

单个orderitems有许多orderitemattributes记录,例如:OPTION_DATEOPTION_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 :(得分:0)

您似乎没有存储连接对象(JFactory::getDbo())。我将包含一个完整的try-catch块,以向您展示一些最佳实践编码,这将在将来有必要进行调试时为您节省大量时间。

您是否编写了代码来捕获可能会遇到的错误:

  

致命错误:对成员函数Quote()的调用为空

换句话说,$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'并且   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,以便您可以更轻松地查询/操作其中的数据未来。

相关问题