我有一组产品关联的attributes
对象在MySQL表格中有不同的建模,具体取决于他们的数据类型(varchar
,int
等)以及产品是否可以具有该属性的多个值或仅具有单个值。
我正在尝试编写能让我获得产品(或产品集)属性和值的代码。我认为创建关联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子句,或者至少使其更简单。
答案 0 :(得分:0)
我想知道它是否有一些本地方法可以添加到" SELECT"部分," FROM / JOIN"部分和" WHERE"一部分。
没有。
PDO不会构建您的查询,而是运行它们。对于查询构建器,查找Doctrine