用于构造具有多个选择和连接的复杂MySQL查询的PDO方法?

时间:2014-02-13 08:06:45

标签: php mysql pdo

我有一组产品关联的attributes对象在MySQL表格中有不同的建模,具体取决于他们的数据类型(varcharint等)以及产品是否可以具有该属性的多个值或仅具有单个值。

我正在尝试编写能让我获得产品(或产品集)属性和值的代码。我认为创建关联SQL的责任是attributes类的责任。

之前我没有使用太多的PDO,除了在其他人的代码中,它被抽象了几个层次。在这里,我自己构建一切,所以我不确定它应该如何工作。

class attributes {

  public function getSql(PDOStatement $sth) {
     // some code to modify the PDOStatement so that it adds the required "SELECT" and "JOIN" clauses to it
    return $sth;
  }

}

class products {
  protected $attributes = array(); // attribute_name => attributes object
  public function addAttributeForLoad(attributes $attribute) {
    $this->attributes[$attribute->get('name')] = $attribute;
    return $this;
  }
  public function loadAttributeValues() {
    foreach($this->attributes as $attribute) {
      $this->dbh->prepare($attribute->getSql());
    }
  }
}

显然loadAttributeValues函数完全(?)错误。我只是试图传达这样的想法,即我从每个用户/系统选择的属性添加到SQL。我知道Zend有这样的功能,但这是普通的PHP。

修改

我被要求提供更多细节,所以在这里。

数据库是一个EAV结构,主产品表包含产品ID,sku和其他“核心”属性,与产品具有一对一的关系。

其他表包含必须连接到product_id上的那些属性的各种属性,以获取其他产品数据。

E.g。

tbl_product_color包含product_id,color_id tbl_product_smell包含product_id,product_smell_id

我可能想要这两个属性,或者只是其中之一。我的SQL看起来像:

SELECT t1.product_id, t1.sku, t3.product_smell
FROM tbl_products t1
LEFT JOIN tbl_product_smell t2 ON t1.id = t2.product_id
LEFT JOIN tbl_smells t3 ON t2.product_smell_id = t3.id
WHERE t1.updated BETWEEN 2014-01-20 AND NOW()
AND t2.product_smell_id IN (13, 17, 19, 23, 29)

现在,我知道我可以将该查询放入PDO。但我想知道它是否有一些本地方法添加到“SELECT”部分,“FROM / JOIN”部分和“WHERE”部分。

理想情况下,我会有一个尚未加载的产品集合对象,我可以添加属性,它将处理这3个元素(select,from / join,where)。

E.g。

$attribute = attributes::getByName('product_smell');
$limit_by = array('value','in',array('strong','medium','extra stinky')); // array containing 1.) compare to value or id, 2.) operator (in, nin, eq, neq, gt, lt, etc), 3.) operand

$product_collection->addAttribute($attribute,$limit_by);

$product_collection->load();

foreach($product_collection as $product) {
  // do stuff like display on screen or whatever
}

sql需要部分构建。在另一个应用程序中,我编写了“手动”执行此操作的代码,一旦构建了查询,它就会使用已弃用的mysql_query发送。我只是想知道PDO是否能够以这种方式添加到SELECT,FROM / JOIN和WHERE子句,或者至少使其更简单。

1 个答案:

答案 0 :(得分:0)

  

我想知道它是否有一些本地方法可以添加到" SELECT"部分," FROM / JOIN"部分和" WHERE"一部分。

没有。

PDO不会构建您的查询,而是运行它们。对于查询构建器,查找Doctrine