我有下面的代码,当我调用我的find方法时,它会在CActiveFinder的第784行显示:“为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);当它到达以下代码时,它会失败:
$objCampanie = $modelCampanii->with('stocs')->findAll();来自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'),
);
}来自类存储的关系
* @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'),
);
}问题出在哪里?为什么它不能检索我的代码?
表结构: 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 ;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`);发布于 2013-01-05 05:39:59
该问题是由于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);
}
...上面的代码来自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
发布于 2013-11-27 16:00:25
在Yii框架从1.1.11更新到1.1.14之后,我在CActiveFinder(834)中得到了同样的错误。所有工作都在更新之前,所有主键都设置好了。
经过一番努力,我发现当我清理我的YiiCache (我在我的配置中启用了CDbCache )时,错误已经消失了。
TRUNCATE YiiCache或DELETE FROM YiiCache
https://stackoverflow.com/questions/14163517
复制相似问题