3

次のコードがあり、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'),
    );
}

クラス 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'),
    );
}

問題はどこだ?コードが取得されないのはなぜですか?

テーブル構造: カンパニー:

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 に答える