Cactivefinder类中的Populaterecord方法对$This->_Pkalias的验证问题

刚上手yii,对框架结构不是很了解.

昨天做了一个mysql的视图,用gii建立了model,创建crud的时候提示没有主键,于是只创建了Controller,然后从别的控制器里复制了一个list,用于显示,大体结构如下:



	public function actionList()

	{

		$start = $_GET['start'];

		$limit = $_GET['limit'];

		$dataProvider=new CActiveDataProvider('Fvl',array(

				'criteria'=>array(

						'select'=>'*',

						'with'=>array('author','goods','region',),

				),

				'pagination'=>array(

						'currentPage'=>$start/8,

						'pageSize'=>$limit,

				)));

		$totalCount = $dataProvider->getTotalItemCount();

		$r=new BaseObject();

		$r->totalCount=$totalCount;

		$data=array();

		foreach ($dataProvider->data as $m)

		{

			$item=array();

			$item["id"]=$m->fvfvx;

			$item["pid"]=$m->blptx;

			$item["market"]=$m->region->regionname;

			$item["product"]=$m->goods->goodsname;

			$item["time"]=$m->fvtime;

			$item["opertor"]=$m->author->name;

			$data[]=$item;

		}

		$r->data=$data;

		echo CJSON::encode( $r );

	}



然后执行的时候,爆出一个错误:




PHP warning


Invalid argument supplied for foreach()


F:\blu10ph\php\htdocs\YiiWebBase\yii\framework\db\ar\CActiveFinder.php(784)


772     {

773         // determine the primary key value

774         if(is_string($this->_pkAlias))  // single key

775         {

776             if(isset($row[$this->_pkAlias]))

777                 $pk=$row[$this->_pkAlias];

778             else    // no matching related objects

779                 return null;

780         }

781         else // is_array, composite key

782         {

783             $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);

792         }

793         /*else if(is_array($this->_pkAlias)) // is_array, composite key

794         {

795             $pk=array();

796             foreach($this->_pkAlias as $name=>$alias)




然后我修改了下代码:




else if(is_array($this->_pkAlias)) // 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);

		}else{ 

			$pk=array();

			$pk=serialize($pk);

                        var_dump($this->_pkAlias);

                        exit;

		}



页面输出是null,看来这里$this->_pkAlias还有种可能是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);

		}*/

		else if(is_array($this->_pkAlias)) // 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);

		}else{ // is_null

			$pk=array();

			$pk=serialize($pk);

		}



这样页面上倒是返回数据了,但是通过视图出来的应该有四条,这个结果只有一条,感觉应该还是和(数据来源是视图并且没有主键)有关系,搜索了下yii关于数据库中的视图,没找到满意的答案,不知道大家能不能帮我看下怎么解决从数据库的视图获取数据的问题?~

问题解决了,没有主键的表在model里声明个主键就行:




	public function primaryKey()

	{

		return 'flflx';

	}



加上这个之后返回数据就不是一条了,不过CActiveFinder中的populateRecord方法最开始的判断,不是字符串就是数组真的没问题吗?~