【问题标题】:PDO method for constructing complex MySQL queries with many selects and joins?用于构造具有许多选择和连接的复杂 MySQL 查询的 PDO 方法?
【发布时间】:2014-02-18 14:27:53
【问题描述】:

我有一组与产品相关的 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 上的那个才能获取其他产品数据。

例如

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 语句并指出哪些属性是动态的,你可以帮助我们帮助你。

标签: php mysql pdo


【解决方案1】:

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

没有。

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

【讨论】:

    猜你喜欢
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多