yii CActiveRecord with()

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)

Wil*_*ema 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);
    }
...
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