2012-07-11 4 views
0

Zend Framework를 사용하여 소셜 네트워크를 구축하려고합니다. 그러나 최근에는 Zend 언어로 복잡한 SQL 쿼리를 작성하는 데 어려움이 있습니다. 예 :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() 객체를 사용하여이 쿼리를 어떻게 실행할 수 있습니까? 고마워요!

답변

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 = $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'); 

을 그리고 그 작업을 수행해야합니다

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 

지금은 더 '젠드 친화적'방식으로 작성되어 있음을 쉽게 젠드로 변환 시작할 수 있습니다.

+0

$ select-> where ('r.usera = {$ user}'); $ select-> join (array ('r'=> '관계'), 'IF (r.usera = {$ user}, u.ID = r.userb, u.ID = r.usera)', ''); 이 두 부분이 중복되지 않습니까? – Yangrui

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