0

私のアプリケーションでは、メッセージモデルに、現在のユーザー($ id)によって送信されたすべてのメッセージを返すメソッドがあります。3つの結合を使用して3つのテーブルから情報を返します。送信者と受信者の両方が同じ「users」テーブルから来ているので、これらの列にエイリアスを付ける必要がありました。

私のメッセージモデルのメソッド:

public function getSentMessages($id) 
{
    $messageModel = new self();
    $select = $messageModel->select()
                 ->from(array('m' => 'messages'),
                        array('m.id', 'm.title', 'm.send',
                              's.id AS s_id', 's.firstname AS s_fn', 's.lastname AS s_ln', 's.email AS s_e', 
                              'r.id AS r_id', 'r.firstname AS r_fn', 'r.lastname AS r_ln', 'r.email AS r_e'))
                 ->join(array('s' => 'users'),
                        'm.from = s.id')
                 ->join(array('mu' => 'messages_users'),
                        'm.id = mu.message_id')
                 ->join(array('r' => 'users'),
                        'r.id = mu.user_id')
                 ->where('m.from = ?', $id);


    $select->setIntegrityCheck(false); 
    $messages = $messageModel->fetchAll($select);

    return $messages;
}

奇妙なことが起こっています:結果行は私が要求したすべての列から作成されました...しかし、どういうわけかすべての列(私が要求しなかったものを含む)が後に追加されました。このような:

id  title   send    s_id    s_firstname     s_lastname  s_email     r_id    r_firstname     r_lastname  r_email     id  username    password    firstname   lastname    email   role    id  message_id  user_id     status  id  username    password    firstname   lastname    email   role

Zend Frameworkによって返されるSQLクエリが、期待したものではないことがわかりました。これが(読みやすくするためにクリーンアップされた)ものです。

SELECT m.id, m.title, m.send, 
s.id AS s_id, s.firstname AS s_fn, s.lastname AS s_ln, s.email AS s_e, 
r.id AS r_id, r.firstname AS r_fn, r.lastname AS r_ln, r.email AS r_e, 
s. * , mu. * , r. *
FROM messages AS m
INNER JOIN users AS s ON m.from = s.id
INNER JOIN messages_users AS mu ON m.id = mu.message_id
INNER JOIN users AS r ON r.id = mu.user_id
WHERE (
m.from = '12345'
)

SELECTステートメントの最後にあるこれらのアスタリスク(*)を確認してください。これらはどのようにしてそこに到達したのですか?Zendのドキュメントによると、アスタリスクは列が指定されていない場合にのみ使用されます。

助けてくれてありがとう!

4

1 に答える 1

2

結合には3つのパラメーターがあります。

各Join句の最後に空白の値を追加します。

join(array('s' => 'users'),'m.from = s.id','')
于 2012-07-07T13:17:55.633 に答える