3

我有以下代码,当我调用我的 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);

到达此代码时失败:

$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'),
    );
}

类 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'),
    );
}

哪里有问题?为什么它不检索我的代码?

表结构: 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 ;

股票:

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`);
4

2 回答 2

6

问题是由于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-01-04T21:39:58.667 回答
0

在 Yii 框架从 1.1.11 更新到 1.1.14 后,我在 CActiveFinder(834) 中遇到了同样的错误。更新前一切正常,所有主键都已设置。

经过一番挣扎后,我发现清理 YiiCache 时错误消失了(我在配置中启用了 CDbCache)。

TRUNCATE YiiCache或者DELETE FROM YiiCache

于 2013-11-27T08:00:24.587 回答