0

Zend Framework を使用してソーシャル ネットワークを構築しようとしています。しかし、最近、いくつかの複雑な 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() オブジェクトを使用してこのクエリを実行するにはどうすればよいでしょうか? どうもありがとうございました!

4

3 に答える 3

0

非常に複雑なクエリの場合は、SQL を使用する方が簡単な場合があります。SQL インジェクションを防ぐために、クエリに入力されるすべてのパラメーターが適切にエスケープされることだけが重要です。

于 2012-07-11T09:28:37.410 に答える
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

ここで、すべての関係を結合に変換します。結合は最初はややこしいですが、テーブルと、テーブルが別のテーブルに結合する基準を 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

より「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');

そして、それは仕事をするはずです。

于 2012-07-11T12:09:41.157 に答える
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));
于 2012-07-11T09:46:26.127 に答える