2012-07-11 71 views
0

我想用Zend Framework構建一個社交網絡。但是,最近我很難將一些複雜的SQL查詢轉換爲Zend語言。例如:複雜的SQL查詢到Zend

"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()對象執行此查詢?非常感謝你!

回答

0

每當我有複雜的查詢處理,我通常會盡量在MySQL運行。一旦我找到了確切的SQL語句,我就開始將它翻譯成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'); 

和應做的工作。

+0

$ select-> where('r.usera = {$ user}'); ('r'=>'relationships'),'IF(r.usera = {$ user},u.ID = r.userb,u.ID = r.usera)', '');這兩個重疊嗎? – Yangrui 2012-07-12 06:46:37

0

對於非常複雜的查詢,使用SQL可能更容易。只有重要的是,所有進入查詢的參數都能正確轉義以防止SQL注入。

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)); 
+0

非常感謝。 – Yangrui 2012-07-11 11:27:01