离开加入zend框架

时间:2011-12-21 12:13:43

标签: zend-framework zend-db zend-db-table

我是ZF的新手,我想在country.id = firm_dtl.firm_country

上加入一个名为country的表格。
$firmobj->fetchAll($firmobj->select($this)->where("firm_name like '$alpha%'")->order('firm_name'));

我该怎么办? 我正在尝试使用此代码: -

$firmobj->select($this)->joinLeft(array("c"=>"country"), "c.id = firm_dtl.firm_country","c.name")->where("firm_name like '$alpha%'")->order('firm_name');

2 个答案:

答案 0 :(得分:3)

以下是您可以尝试使左连接工作以及提高安全性的一些事项。

我通常在多行中构建我的select语句,所以我喜欢把它放在一个变量中。为了调试,我只是注释掉我不需要的行。

$select = $firmobj->select()->from('country');

您需要setIntegrityCheck(false),因为您可能不会更改并提交查询结果。以下是ZF文档中关于它的引用。

  

Zend_Db_Table_Select主要用于约束和验证   这样它可以强制执行合法的SELECT查询的标准。然而   在某些情况下,您需要灵活性   Zend_Db_Table_Row组件,不需要可写或可删除   行。对于这个特定的用户案例,可以检索一行或   通过将FALSE值传递给setIntegrityCheck()来实现行集。

$select->setIntegrityCheck(false);

这是您加入的地方。您可以将field1,field2,fieldn替换为您要在结果中看到的firm_dtl表中的字段。

$select->joinLeft(array('c' => 'country'), 'c.id = firm_dtl.firm_country', array('field1', 'field2', 'fieldn'));

使用参数替换来避免SQL注入攻击。

$select->where('firm_name LIKE ?', "$alpha%");

最后订购结果并获取行集。

$select->order('firm_name');
$rowSet = $firmobj->fetchAll($select);

答案 1 :(得分:2)

joinLeft函数的第3个参数应该是要获取的列数组。

$firmobj->select($this)
        ->joinLeft(array("c"=>"country"), "c.id = firm_dtl.firm_country", array("c.name"))
        ->where("firm_name like '$alpha%'")
        ->order('firm_name');

此外,更好的方法是以这种方式使用where函数:

->where("firm_name like ?", $alpha . "%")

这种方式是更安全的解决方案。