1

我正在尝试使用该find函数通过 id 查询数据库表。该表有 4 个主键(3 个外键)。
这是表数据网关的代码:

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

这是映射器的代码:

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_randxmp标记很好地查看了代码返回的内容。我得到的异常消息是:

Message: Too few columns for the primary key  

我不知道该怎么做才能解决它。任何想法?谢谢!

4

2 回答 2

1

好的 find() 将按主键返回行,如果您需要传递复合主键,则只有主键必须是数组。

这是 find() 的文档块:

/**
 * 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() 您可以查询行中的任何列,但它只会返回一行。如果您需要返回一个行集,您可以使用具有相同查询选项的 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');
}

但是当你想找到这条记录时,你不能只通过一个主键来查找,甚至不能用它们传递一个数组(这就是我正在做的),find 方法正在等待无限数量的参数作为主键键的值(按照您声明的相同顺序),如下所示:

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