您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
5-7 数据模型之关联查询(hasMany,hasOne)
发布时间:2023-04-28 18:09:13编辑:雪饮阅读()
-
模型关联查询一般都是在两个表之间有关联关系。
比如这里就是wp_posts是文章表,该表中post_author字段对应于wp_users表(用户表)中的ID字段。
这里主要是演示下一个用户的文章列表的查询和一篇文章所属用户的查询
可以在模型中通过hasMany和hasOne两种关系。
那么hasMany与hasOne都是可以在控制器中使用,也可以通过hasMany和hasOne将上面两个业务封装到对应这两个模型中,然后通过模型以方法调用或者以属性调用皆可。
那么这里由于涉及到这两个模型了,并且我两个模型都正好封装了上面的两个业务。
那么模型如:
WpPosts:
<?php
namespace app\models;
use yii\db\ActiveRecord;
class WpPosts extends ActiveRecord{
//查看当前文章所属用户
public function getUsers(){
//hasOne第一个参数是对方字段,第二个参数是当前模型字段
return $this->hasOne(WpUsers::className(),['ID'=>'post_author'])->asArray();
}
}
WpUsers:
<?php namespace app\models; use yii\db\ActiveRecord; class WpUsers extends ActiveRecord{ //查看当前用户的文章列表 public function getPosts(){ return $this->hasMany(WpPosts::className(),['post_author'=>'ID'])->asArray()->all(); } }然后控制器中的查询实例如:
<?php namespace app\controllers; use app\models\WpPosts; use app\models\WpUsers; use yii\web\Controller; class HelloController extends Controller{ public $layout='common'; public function actionIndex(){ /* 查询用户的文章列表 wp_posts表中的post_author字段对应wp_users表中的ID字段 hasMany是第一个参数是对方字段,第二个参数是当前模型字段 * */ $posts=WpUsers::find()->where(["ID"=>1])->one()->hasMany('app\models\WpPosts',['post_author'=>'ID'])->all(); print_r($posts); } public function actionIndex2(){ //也支持asArray print_r(WpUsers::find()->where(["ID"=>1])->one()->hasMany('app\models\WpPosts',['post_author'=>'ID'])->asArray()->all()); } public function actionIndex3(){ //hasMany第一个参数是类名,类名可以动态获取 print_r(WpUsers::find()->where(["ID"=>1])->one()->hasMany(WpPosts::className(),['post_author'=>'ID'])->asArray()->all()); } public function actionIndex4(){ //调用封装在WpUsers模型中的getPosts方法以获取到用户的文章列表 print_r(WpUsers::find()->where(["ID"=>1])->one()->getPosts()); } public function actionIndex5(){ //调用封装在WpUsers模型中的getPosts方法以获取到用户的文章列表(以属性方式调用) print_r(WpUsers::find()->where(["ID"=>1])->one()->Posts); } public function actionIndex6(){ //通过一篇文章查看该篇文章所属用户 print_r(WpPosts::find()->where(["ID"=>1801])->one()->users); } }
关键字词:关联查询,hasMany,hasOne