tzo*_*zik 3 database foreach yii
我有以下代码,当我调用我的find方法时,它向我显示:"在第784行的CActiveFinder中为foreach()提供的参数无效":
$pk=array();
784 foreach($this->_pkAlias as $name=>$alias)
785 {
786 if(isset($row[$alias]))
787 $pk[$name]=$row[$alias];
788 else // no matching related objects
789 return null;
790 }
791 $pk=serialize($pk);
Run Code Online (Sandbox Code Playgroud)
它到达此代码时失败:
$objCampanie = $modelCampanii->with('stocs')->findAll();
Run Code Online (Sandbox Code Playgroud)
Campanii班的关系:
* @property Stoc[] $stocs
* @property Vanzari[] $vanzaris
public function relations()
{
return array(
'stocs' => array(self::HAS_MANY, 'Stoc', 'id_campanie'),
'vanzaris' => array(self::HAS_MANY, 'Vanzari', 'id_campanie'),
);
}
Run Code Online (Sandbox Code Playgroud)
来自Stoc类的关系
* @property Produse $codProdus
* @property Campanii $idCampanie
* @property Vanzari[] $vanzaris
public function relations()
{
return array(
'codProdus' => array(self::BELONGS_TO, 'Produse', 'cod_produs'),
'idCampanie' => array(self::BELONGS_TO, 'Campanii', 'id_campanie'),
'vanzaris' => array(self::HAS_MANY, 'Vanzari', 'cod_produs'),
);
}
Run Code Online (Sandbox Code Playgroud)
问题出在哪儿?为什么不检索我的代码?
表结构:Campanii:
CREATE TABLE IF NOT EXISTS `campanii` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nume` varchar(255) NOT NULL,
`data_comanda` date NOT NULL,
`data_scadenta` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
Run Code Online (Sandbox Code Playgroud)
STOC:
CREATE TABLE IF NOT EXISTS `stoc` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_campanie` int(11) NOT NULL,
`cod_produs` varchar(10) NOT NULL,
`cantitate` int(11) NOT NULL,
`pret` double NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `id_campanie` (`id_campanie`),
KEY `cod_produs` (`cod_produs`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
--
-- Constraints for table `stoc`
--
ALTER TABLE `stoc`
ADD CONSTRAINT `stoc_ibfk_1` FOREIGN KEY (`id_campanie`) REFERENCES `campanii` (`id`),
ADD CONSTRAINT `stoc_ibfk_2` FOREIGN KEY (`cod_produs`) REFERENCES `produse` (`cod`);
Run Code Online (Sandbox Code Playgroud)
问题是由于stoc表中缺少主键.原因如下:
private function populateRecord($query,$row)
{
// determine the primary key value
if(is_string($this->_pkAlias)) // single key
{
if(isset($row[$this->_pkAlias]))
$pk=$row[$this->_pkAlias];
else // no matching related objects
return null;
}
else // is_array, composite key
{
$pk=array();
foreach($this->_pkAlias as $name=>$alias)
{
if(isset($row[$alias]))
$pk[$name]=$row[$alias];
else // no matching related objects
return null;
}
$pk=serialize($pk);
}
...
Run Code Online (Sandbox Code Playgroud)
以上代码来自CActiveFinder.正如你所看到的,如果一个表的_pkAlias不是字符串,然后它假定它是一个数组,而不检查,看看是否有主键存在的.
因此,当你调用with('stocs'),CActiveFinder试图填充相关的记录(的意思,populateRecord叫),它试图找出PK作为其正常过程的一部分,并且由于缺乏一个PK的这么失败.
最终,它是框架代码中不正确假设的结果.它可以通过简单地创建PK来解决(如您所见).
您可以从第385行开始查看CActiveFinder,了解如何设置值_pkAlias.
https://github.com/yiisoft/yii/blob/1.1.13/framework/db/ar/CActiveFinder.php
| 归档时间: |
|
| 查看次数: |
2520 次 |
| 最近记录: |