1

find関数を使用して、ID でデータベース テーブルをクエリしようとしています。テーブルには 4 つの主キー (3 つの外部キー) があります。
これは、テーブル データ ゲートウェイのコードです。

class Application_Model_DbTable_Assigneduser extends Zend_Db_Table_Abstract
{  
    protected $_name = 'assigneduser';  
}  

これは Mapper のコードです:

public function find($id)
{
    $result = $this->getDbTable()->find($id);
    if(count($result) == 0)
        return;
    $row=$result->current();
    $assignedUser = new Application_Model_AssignedUser();
    $assignedUser->setId($row->id)
        ->setIdProject($row->id_project)
        ->setIdUser($row->id_user)
            ->setIdTask($row->id_task);
}  

マッパーをインスタンス化するために使用するコードと、メソッドを使用する場所find:

public function indexAction()
{
        echo "<xmp>";
        $user=new Application_Model_AssignedUserMapper();
        print_r($user->find(3));
        echo '</xmp>';
}  

print_randタグを使用しxmpて、コードが返すものをよく調べました。私が受け取る例外メッセージは次のとおりです。

Message: Too few columns for the primary key  

それを修正するために何をすべきかわかりません。何か案が?ありがとうございました!

4

2 に答える 2

1

Ok find() は主キーで行を返し複合主キーを配列として渡す必要がある場合は主キーのみを返します。

find() の doc ブロックは次のとおりです。

/**
 * Fetches rows by primary key.  The argument specifies one or more primary
 * key value(s).  To find multiple rows by primary key, the argument must
 * be an array.
 *
 * This method accepts a variable number of arguments.  If the table has a
 * multi-column primary key, the number of arguments must be the same as
 * the number of columns in the primary key.  To find multiple rows in a
 * table with a multi-column primary key, each argument must be an array
 * with the same number of elements.
 *
 * The find() method always returns a Rowset object, even if only one row
 * was found.
 *
 * @param  mixed $key The value(s) of the primary keys.
 * @return Zend_Db_Table_Rowset_Abstract Row(s) matching the criteria.
 * @throws Zend_Db_Table_Exception
 */

修正するには:

class Application_Model_DbTable_Assigneduser extends Zend_Db_Table_Abstract
{  
    protected $_name = 'assigneduser';
    protected $_primary = array('column','column'...); //This is not strictly required but may help.
} 


public function indexAction()
{
        $user=new Application_Model_AssignedUserMapper();
        Zend_Debug::dump($user->find(array(3,,,)), 'User');//outputs formatted var_dump with optional label as second arg.
} 

これを簡単にするために:

public function find($id)
{
    $select = $this->getDbTable->select();
    $select->where('id = ?', $id);
    $result = $this->getDbTable()->fetchRow($select);//will return only one row, if you need more use fetchAll()
    if(is_null($result)) //fetchRow() returns NULL if no rows found.
        return;
    $row=$result;
    $assignedUser = new Application_Model_AssignedUser();
    $assignedUser->setId($row->id)
                 ->setIdProject($row->id_project)
                 ->setIdUser($row->id_user)
                  ->setIdTask($row->id_task);
}  

fetchRow() を使用すると、行内の任意の列に対してクエリを実行できますが、返されるのは 1 行のみです。行セットを返す必要がある場合は、同じクエリ オプションで fetchAll() を使用すると、行セットを取得できます。

お役に立てれば。

于 2012-07-11T08:51:52.667 に答える
0

私はちょうど同じ問題を抱えていました。ZF バージョン 1.11.11 では、RockyFord が言ったように、次のように主キーである列の配列を DbTable クラスにマップするだけです。

class AssignedUser extends Zend_Db_Table_Abstract
{
    protected $_name = 'assigned_user';
    protected $_primary = array('user_id','project_id','task_id');
}

しかし、このレコードを見つけたいときは、主キーの 1 つだけで見つけることはできず、配列を渡すことさえできません (これが私が行っていたことです)。find メソッドは、主キーとして無制限の数の引数を待機しています。次のように、キーの値(宣言したのと同じ順序に従います):

$assignedUserTable = new AssignedUser();
$rowset = $assignedUserTable->find( $userId, $projectId, $taskId );
$row = $rowset->current();
于 2013-04-29T04:39:51.333 に答える