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
,如果它是主键或外键的一部分,那么它应该是一个值。听起来您的数据库存在一些设计问题。