【发布时间】:2014-02-18 14:27:53
【问题描述】:
我有一组与产品相关的 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 上的那个才能获取其他产品数据。
例如
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 个元素(选择、来自/加入、位置)。
例如
$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 子句,或者至少让它更简单。
【问题讨论】:
-
我不太确定你想要达到什么目的。您是否尝试从给定列中获取列名和属性?如果是这样,您可以查看 MySQL 提供的 SHOW COLUMNS 语句。
-
@KevinOpdenKamp 抱歉,不,每个属性都存储在一个单独的表中,因此每个属性都需要一个连接,因此每个 SELECT 也会有一个表别名。例如。
LEFT JOIN t6.color ON t1.product_id = t6.product_id -
那我不太确定你想要实现什么或者你的数据结构是什么样的......祝你好运
-
不知道你到底想要什么。如果你提供一个示例 SQL 语句并指出哪些属性是动态的,你可以帮助我们帮助你。