首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带()的yii CActiveRecord

带()的yii CActiveRecord
EN

Stack Overflow用户
提问于 2013-01-05 03:22:56
回答 2查看 2.6K关注 0票数 3

我有下面的代码,当我调用我的find方法时,它会在CActiveFinder的第784行显示:“为foreach()提供的无效参数”:

代码语言:javascript
复制
$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);

当它到达以下代码时,它会失败:

代码语言:javascript
复制
$objCampanie = $modelCampanii->with('stocs')->findAll();

来自Campanii类的关系:

代码语言:javascript
复制
 * @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'),
    );
}

来自类存储的关系

代码语言:javascript
复制
* @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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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`);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-05 05:39:59

该问题是由于stoc表中缺少主键造成的。原因如下:

代码语言:javascript
复制
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

票数 6
EN

Stack Overflow用户

发布于 2013-11-27 16:00:25

在Yii框架从1.1.11更新到1.1.14之后,我在CActiveFinder(834)中得到了同样的错误。所有工作都在更新之前,所有主键都设置好了。

经过一番努力,我发现当我清理我的YiiCache (我在我的配置中启用了CDbCache )时,错误已经消失了。

TRUNCATE YiiCacheDELETE FROM YiiCache

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14163517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档