复杂的SQL查询到Zend

时间:2012-07-11 09:20:24

标签: php mysql zend-framework

我正在尝试使用Zend Framework构建社交网络。但是,最近我很难在Zend语言中进行一些复杂的SQL查询。例如:

"SELECT t.plural_name, p.name as users_name, u.ID 
FROM users u, profile p, relationships r, relationship_types t 
WHERE t.ID=r.type 
      AND r.accepted=1 
      AND (r.usera={$user} OR r.userb={$user}) 
      AND IF( r.usera={$user},u.ID=r.userb,u.ID=r.usera) 
      AND p.user_id=u.ID"

如何使用Zend的select()对象执行此查询?非常感谢你!

3 个答案:

答案 0 :(得分:0)

对于非常复杂的查询,使用SQL可能更容易。进入查询的所有参数都必须正确转义以防止SQL注入。

答案 1 :(得分:0)

你可以把它作为例子:(虽然它不完整)

<?php
$this->_query = $this->_DB->select()->from(array('u'=>'users'),array('(u.ID)'))
                                    ->join(array('p'=>'profile'),
                                               'p.user_id = u.ID',
                                               'p.name AS users_name')
                                     ->join(array('r'=>'relationships'),
                                               'r.userb = u.ID')    
                                    ->join(array('t'=>'relationship_types'),
                                               't.ID = r.type',
                                               't.plural_name')

                                    ->where('t.ID = r.type AND r.accepted = 1')
                                    ->where('r.usera = :user')
                                    ->orWhere('r.userb = :user')
                                    ->bind(array('user'=>$user));

答案 2 :(得分:0)

每当我有复杂的查询要处理时,我通常会尝试在MySQL中运行它们。一旦找到确切的SQL语句,我就开始翻译&#39;它到了Zend。我看起来有点复杂,但从长远来看,你马上就可以在Zend做到。这是我如何分解它。 首先弄清楚SQL语句是什么:

SELECT t.plural_name, p.name as users_name, u.ID 
FROM users u, profile p, relationships r, relationship_types t 
WHERE t.ID=r.type AND r.accepted=1 AND
 (r.usera={$user} OR r.userb={$user}) AND
 IF( r.usera={$user},u.ID=r.userb,u.ID=r.usera) AND
 p.user_id=u.ID

现在,您需要将所有关系转换为连接。这些连接在开始时有些可怕,但它只是一种方法,可以将表和它连接的标准放在一行中的另一个表中。

SELECT t.plural_name, p.name AS users_name, u.ID 
FROM users u
INNER JOIN profile AS p ON p.user_id = u.ID
INNER JOIN relationships AS r ON IF(r.usera={$user}, u.ID=r.userb, u.ID=r.usera)
INNER JOIN relationship_types AS t ON t.ID = r.type
WHERE
 (r.usera={$user} OR r.userb={$user}) AND
 r.accepted=1

现在它是用更多的Zend友好版本编写的。方式,您可以轻松地开始将其转换为Zend:

$select = $this->select()->setIntegrityCheck(false);
$select->from(array('u'=>'users'), '');
$select->join(array('p'=>'profile'), 'p.user_id = u.ID', '');
$select->join(array('r'=>'relationships'), 'IF(r.usera={$user}, u.ID=r.userb, u.ID=r.usera)', '');
$select->join(array('t'=>'relationship_types'), 't.ID = r.type', '');
$select->columns(array(
  't.plural_name', 
  'users_name'=>'p.name', 
  'u.ID'));
$select->where('r.usera={$user}');
$select->orWhere('r.userb={$user}');
$select->where('r.accepted=1');

这应该可以胜任。