2011-12-21 2 views
1

Я новичок в ZF и я хотел бы оставил присоединиться к таблице с именем страны на country.id = firm_dtl.firm_countryлевое соединение в рамках ZEND

$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

Этот код не работает? –

ответ

2

3-й параметр функции joinLeft должен быть массив столбцов, которые вы хотите извлечь.

$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("firm_name like ?", $alpha . "%") 

Этот способ является безопасным решением.

3

Вот несколько вещей, которые вы можете попробовать, чтобы заставить левое соединение работать, а также улучшить безопасность.

Обычно я строю свои выражения select во многих строках, поэтому мне нравится помещать их в переменную. Чтобы отлаживать, я просто прокомментирую строки, которые мне не нужны.

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

Вы хотите setIntegrityCheck(false), потому что вы, вероятно, не будет меняться и обязывающее результаты запроса. Вот цитата из документации ZF об этом.

The Zend_Db_Table_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);