1

我有数据库,我的表如下所示:

替代文字 http://img15.imageshack.us/img15/2568/stackdijag.png

我想要做的是获取制造商名称列以 A 开头的所有模型。这意味着查询的简单部分应该像 $manufacturers->fetchAll("name LIKE '$letter%'");

我正在尝试通过 ZF 关系来实现这一点,但它不会,所以欢迎任何形式的帮助......

4

1 回答 1

4
$models = new Models();
$select = $models->select(Zend_Db_Table::SELECT_WITH_FROM_PART);
$select->setIntegrityCheck(false)
       ->join(array("a"=>"manufacturers"), 'models.manufacturer_id = a.id',
         array("man_name"=>"name", "man_description"=>"description"))
       ->where("a.name LIKE 'A%'");
$rowset = $models->fetchAll($select);

不幸的是,Zend_Db_Table关系接口在从其声明的参考映射创建连接查询方面没有太多智能。复杂查询的社区贡献解决方案是Zend_Db_Table_Select查询工厂。

请注意,您必须为制造商的名称和描述提供列别名,否则这些列将在行数据的关联数组中抑制模型的名称和描述。您应该清楚地命名列以避免这种情况。

但在你的情况下,我会跳过表接口和选择接口,直接使用 Db 适配器执行 SQL 查询:

$data = $db->fetchAll("
  SELECT m.*, a.name AS man_name, a.description AS man_description
  FROM Models m JOIN Manufacturers a ON m.manufacturer_id = a.id
  WHERE a.name LIKE 'A%'");

您将以简单的关联数组数组的形式获取数据,而不是作为Zend_Db_Table_Rowset. 但是由于一个连接的行集无论如何都是不可写的,所以您并没有做出太多牺牲。

于 2009-09-14T19:16:48.060 回答