yii2中hasMany 和 hasOne 的用法及在页面中增加字段的问题

大家好,今天我们聊一下yii 中hasMany和hasOne,在页面中增加字段的问题。希望对一些同学有帮助。
hasMany和hasOne的具体的用法手册写的很详细,我们就不多说了。今天重点要了解的是在yii2中gii自动生成crud的情况下,怎么运用关联方法。

一 . 数据库表
订单表

CREATE TABLE `doub_order` (
  `order_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `order_w_id` int(10) unsigned NOT NULL DEFAULT '0',
  `order_name` char(20) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '名称',
  `order_time` int(10) NOT NULL DEFAULT '0' COMMENT '时间',
  PRIMARY KEY (`order_id`),
  UNIQUE KEY `order_w_id` (`order_w_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

订单详情表

CREATE TABLE `doub_order_info` (
  `order_info_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `order_w_id` int(10) unsigned NOT NULL DEFAULT '0',
  `order_info_name` varchar(20) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '名称',
  `goods_id` int(10) unsigned NOT NULL DEFAULT '1' COMMENT '商品id',
  `order_info_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '时间',
  PRIMARY KEY (`order_info_id`),
  KEY `order_w_id` (`order_w_id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

二. 用gii生成相应的代码自己生成一下就好了。
yii2中hasMany 和 hasOne 的用法及在页面中增加字段的问题
三、 之后我们要修改一下代码,让他们进行关联 这里就重点说一下hasMany.

  1. 在order model 中修改
/**
	 * biaoqian
	 *增加字段名称 'goods_id'   => '课程',
	 */
	public function attributeLabels()
	{
		return [
			'order_w_id' => '订单号',
			'order_name' => '订单名称',
			'order_time' => '时间',
			'goods_id'   => '课程',
		];
	}

	/**
	 * 一个订单有多个订单详情
	 * @return \yii\db\ActiveQuery
	 *
	 */
	public function getOrderInfo()
	{
		return $this->hasMany(OrderInfo::className(),['order_w_id'=>'order_w_id']);
	}
  1. 更改OrderSearch model
//增加了一个安全验证 orderInfo.goods_id
public function rules()
	{
		//safe : 安全
		return [
			[['order_id','order_w_id','order_name','order_time','orderInfo.goods_id'], 'safe'],
			[['order_id','order_w_id','order_time'], 'integer'],
			//[['orderInfo.goods_id'],'safe']
		];
	}

//	$query->joinWith('orderInfo');进行左关联
public function search($params)
	{
		$query = Order::find();

		//数据提供者
		$dataProvider = new ActiveDataProvider(
			[
				'query' => $query,
				'pagination' => [
					'pageSize' => 20,
				],

			]
		);
		$query->joinWith('orderInfo');
		//$query->select('doub_order.*,doub_order.order_w_id,doub_order_info.goods_id');
        //加载参数
		$this->load($params);
        if (!$this->validate()) {

			return $dataProvider;
		}

		//条件
		$query->andFilterWhere(

			[
				'order_w_id' => $this->order_w_id,
				'order_time' => $this->order_time,
			]
		);

		$query->andFilterWhere(['like','order_name',$this->order_name]);
		//echo $query->createCommand()->getRawSql();
		return $dataProvider;
	}

  1. 前端 它是用bootstrap和小组件构成
<?= GridView::widget([
							 'dataProvider' => $dataProvider,
							 'filterModel' => $searchModel,
							 'columns' => [
								 ['class' => 'yii\grid\SerialColumn'],
								 'order_w_id',
								 'order_name',
								 'order_time:datetime',
//								  'orderInfo.goods_id',
								 [
									 'attribute' => 'goods_id',//要和后台统一
									 'value' => function ($searchModel) {
										 $_tag = $searchModel->orderInfo;//获取对象
										 //  print_r($_tag);
										 if(!empty($_tag)){
											 $tagName="";
											 foreach ($_tag as $key => $value) {
												 //print_r($value);

												 $tagName.=$value['goods_id'].'/';
											 }
											 return rtrim($tagName,'/');
										 }

									 }
								 ],

								 ['class' => 'yii\grid\ActionColumn'],
							 ],
						 ]); ?>

最后

yii2中hasMany 和 hasOne 的用法及在页面中增加字段的问题