Zend framework Zend框架:数据库查找抛出;主键“的列太少”;例外

Zend framework Zend框架:数据库查找抛出;主键“的列太少”;例外,zend-framework,Zend Framework,我正在尝试使用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查询数据库表。该表有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>';
}  
我不知道该怎么做才能把它修好。有什么想法吗?谢谢大家!

Ok find()将按主键返回行,如果需要传递复合主键,则只返回主键,它必须作为数组

以下是find()的文档块:

要修复:

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(),您将得到一个行集。

希望这有帮助。

确定查找()将按主键返回行,如果需要传递复合主键,则只返回主键,它必须作为数组

以下是find()的文档块:

要修复:

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(),您将得到一个行集。


希望这有帮助。

我也有同样的问题。在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');
}
$assignedUserTable = new AssignedUser();
$rowset = $assignedUserTable->find( $userId, $projectId, $taskId );
$row = $rowset->current();
但是,当您想要查找此记录时,您不能只通过其中一个主键进行查找,甚至不能传递一个数组(我就是这么做的),find方法会等待无限数量的参数作为主键的值(按照您声明的相同顺序),如下所示:

class AssignedUser extends Zend_Db_Table_Abstract
{
    protected $_name = 'assigned_user';
    protected $_primary = array('user_id','project_id','task_id');
}
$assignedUserTable = new AssignedUser();
$rowset = $assignedUserTable->find( $userId, $projectId, $taskId );
$row = $rowset->current();

我也有同样的问题。在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');
}
$assignedUserTable = new AssignedUser();
$rowset = $assignedUserTable->find( $userId, $projectId, $taskId );
$row = $rowset->current();
但是,当您想要查找此记录时,您不能只通过其中一个主键进行查找,甚至不能传递一个数组(我就是这么做的),find方法会等待无限数量的参数作为主键的值(按照您声明的相同顺序),如下所示:

class AssignedUser extends Zend_Db_Table_Abstract
{
    protected $_name = 'assigned_user';
    protected $_primary = array('user_id','project_id','task_id');
}
$assignedUserTable = new AssignedUser();
$rowset = $assignedUserTable->find( $userId, $projectId, $taskId );
$row = $rowset->current();

该表是否使用复合pk?@prodigitalson否,它没有声明主变量。这就是你的意思吗?不,我的意思是在数据库模式中如何定义表的主键组合键看起来像
主键(`id`,`some\u other\u column`)
然后你需要将每列的值传递给
find
like
$Table->find(3,5)
第二个键不应该有一个
null
,如果它是主键或外键的一部分,那么它应该是一个值。听起来您的数据库存在一些设计问题。该表是否使用复合pk?@prodigitalson否,它没有声明主变量。这就是你的意思吗?不,我的意思是在数据库模式中如何定义表的主键组合键看起来像
主键(`id`,`some\u other\u column`)
然后你需要将每列的值传递给
find
like
$Table->find(3,5)
第二个键不应该有一个
null
,如果它是主键或外键的一部分,那么它应该是一个值。听起来您的数据库存在一些设计问题。