我是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');
答案 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 . "%")
这种方式是更安全的解决方案。