1

Social Engine 4のモジュール内にあるウィジェットを開発しているときに、クエリで「結合」を使用しようとしています。Dreamweaverで作業しています。私はこの動作するコードを置き換えようとしています:

//creates query to get user's region                
$select = $db->select();
$select->from("engine4_user_fields_search");
$select->where("item_id = ?", $user_id['user_id']);
$stmt = $db->query($select);
$result = $stmt->fetchAll();

次に、長いif-elseチェーンを使用し、「マジックナンバー」を使用してインデックスに加算および減算して結果を取得する必要があります。

参加を使用すると、それをすべて行う必要はありません。簡単なクエリを実行して結果を表示することができます。私が作業しているウィジェットはタブコンテナ内にあるため、問題が発生すると(joinを使用するたびに)、タブ全体が消えてデバッグが問題になります。

これが私が持っているものです:

<?php

class Widget_RegionalBreakingNewsController extends Engine_Content_Widget_Abstract
{

    public function indexAction()
    {
        //connect to DB
        $file = APPLICATION_PATH . '/application/settings/database.php';
        $options = include $file;
        $db = Zend_Db::factory($options['adapter'], $options['params']);
        $select = new Zend_Db_Select($db);
        $db->getConnection();
        //end DB setup


        $user_id = Engine_Api::_()->user()->getViewer();


        //SELECT * FROM engine4_user_fields_search as s 
        //join engine4_user_fields_options as o 
        //WHERE item_id = <current user's ID> AND s.field_7+22 = o.option_id


        $select = $db->select();
        $select->from(array('s' => 'engine4_user_fields_search'),
                      array('s.field_7', 's.user_id'))
               ->joinInner(array('o' => 'engine4_user_fields_options'),
                      's.field_7+22 = o.option_id');
        $select->where("s.item_id = ?", $user_id['user_id']);
        $stmt = $db->query($select);
        $result = $stmt->fetchAll();
        //print_r($result);

これはZendで開発する最初の週なので、最も単純なエラーでさえも却下しないでください。私は違いを生むかもしれない単純な慣習を知らない傾向があります。誰かが助けを提供することができればそれはありがたいです。

PS Zend select関数を使用せず、通常のSQLステートメントを実行する方法はありますか?

4

2 に答える 2

0

コードをもう一度見てみると、問題は次の行だと思います。

$select->from(array('s' => 'engine4_user_fields_search'),
              array('s.field_7', 's.user_id'))

SELECT s.field_7, s.user_id FROM ...意図したものではないと思う2つの列(に相当)のみを選択するように指示していますか?うまくいくと言う最初の例は、engine4_user_fields_searchからすべての列を選択することです。2番目の配列をそのままにして、そのテーブルからすべての列を取得できます。

また、これ:

$stmt = $db->query($select);
$result = $stmt->fetchAll();

次のように書くことができます:

$result = $db->fetchAll($select);

Zend_Db_Selectselectオブジェクトをエコーするだけで問題をデバッグできます。これにより、生成されたクエリが文字列として提供されます。

echo $select;

また、生のSQLを記述したい場合は、それを文字列としてクエリ関数に渡すことができます。

$db->query("
    SELECT * FROM engine4_user_fields_search as s 
    join engine4_user_fields_options as o 
    WHERE item_id = ? AND s.field_7+22 = o.option_id
", array($user_id['user_id']));
于 2013-03-05T21:03:41.877 に答える