您的位置:首页 > 编程语言 > PHP开发

Yii2.0 后台列表整理(关联查询)

2016-04-17 15:31 597 查看
今天是2016-4-16日,周六,对我来说,我上周经历了延期一个周的连续加班时间,让我真的很累,很受不了,其原因在于我是一个菜鸟,一个女程序猿小白,有时候基础真的很差,犯过的错,经常还会再犯,就是因为这,我也没少被我们组长说道,当然了,他也是好心,可是我想说,有时候我真的好累啊,我也想学好,什么都会,可是我就是不会,比起其他的人我明显处于劣势. 然后我们公司这次的加薪,我不在名单之内,原因就是因为技术不好, 其实对于我来说,不光是钱的事,我真该好好反思自己了,每次做什么事都是吊儿郎当,总是坚持不下去,有时候也很讨厌现在的自己,不过,不是有句话说吗,当你意识到你身上的问题时,都不算太晚,所以我已经比自己坚持一项事情,那就是每天学习至少半小时(除了工作时间之外),
我一定要证明给自己看,我不笨,我要自信起来,因为当你都放弃你自己的时候,你说谁还会拉你一把那,凡事全靠自己, 相信自己一定做得更好!

----------------------至现在的菜鸟我

好了, 言归正传.....说说项目遇到的问题和要记住的知识点吧!

我们有个关于crm的后台,就是需要写一些列表,他们之间表关系很复杂.......

我们的项目大致是这样的:



下面我就说说上面的班型,期次, 班级, 负责人, 他们都只通过多个表之间的相互关联得到的结果.下面是我手写的分析:

错误更正: 下面途中最后负责人关联是crm_hmy中的contact_id和crm_contact中的contact_id关联得到charger_id,然后crm_contact_中的charger_id中的crm_employee中的id查出truename



代码如下:

HmyMemberSerach.php文件
class HmyMemberSearch extends HmyMember
{
//当你进行关联表时,需要查询其他表中的字段时,所有就需要定义你要查询的字段名称
public $class_no;
public $grade_no;

/**
* @inheritdoc
*/
public function rules()
{
//当你在后台列表想要搜索哪个字段时,那么首先这个rules里面就带有这个字段
return [
[['birthday', 'class_no', 'grade_no', class_id', 'charger_id', 'auth_status'], 'integer'],
[['truename', 'sex', 'mobile', 'email', 'weixin', 'entry_status'], 'safe'],
[['corp_name'], 'string']
];
}

/**
* Creates data provider instance with search query applied
*
* @param array $params
*
* @return ActiveDataProvider
*/
public function search($params)
{
//我查的是认证状态为1的列表
$query = HmyMember::find()->where(['crm_hmy.auth_status' => 1]);

$appName = false;
$termName = false;
$contactName = false;
$employeeName = false;

try {
//获取表名
$termName = Yii::$app->util->getTableName('db', HmyTerm::tableName());
$className = Yii::$app->util->getTableName('db', HmyClass::tableName());
$contactName = Yii::$app->util->getTableName('db', Contact::tableName());
$employeeName = Yii::$app->util->getTableName('db', Employee::tableName());
} catch (\Exception $e) {
}

//定义一些表的别名,以便下面用
$termNameAlias = 'term';
$classNameAlias = 'class';
$contactNameAlias = 'contact';
$employeeNameAlias = 'employee';
$this->load($params);

//关联查询 - 班型, 期次   注:crm_hmy中的class_id关联crm_hmy_term中的id, 查询crm_hmy_term中的name(班型),grade_no(期次)
下面的查询"id",一定要有,因为他们关联到term中的id,所以你要是不查它的话,就会报错...
$query->with(['term' => function($query) use ($termName, $termNameAlias) {
return $query->from($termName . ' as ' . $termNameAlias)->select('id, name, grade_no');
}]);

//关联查询 - 班级  注: crm_hmy中的class_id关联crm_hmy_class中的term_id, 查询crm_hmy_class中的class_no(班级)
$query->with(['class' => function($query) use ($className, $classNameAlias) {
return $query->from($className . ' as ' . $classNameAlias)->select('term_id , class_no');
}]);

//关联查询 - 负责人 注: crm_hmy中的contact_id关联crm_contact中的contact_id,查询出crm_contact中的charger_id, 然后
把crm_contact中的charger_id关联crm_employee中的id,查询负责人truename
$query->Joinwith(['contact' => function($query) use ($contactName, $employeeName) {
$quer = $query->Joinwith(['employee' => function($quer) use ($employeeName) {
return $quer->from($employeeName)->select('id, truename');
}])->from($contactName)->select('contact_id, charger_id');
}]);

if (($this->class_id) || ($this->class_no) || ($this->grade_no)) {
if ($termName) {
//hmy - term 表关联 主要是让表与表之间建立关联
$query->Joinwith(['term' => function($query) use ($termName, $termNameAlias) {
return $query->from($termName . ' as ' . $termNameAlias);
}]);
}

if ($className) {
//hmy - class 表关联
$query->Joinwith(['class' => function($query) use ($className, $classNameAlias) {
return $query->from($className . ' as ' . $classNameAlias);
}]);
}
}

$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => [         //查询让id为倒序
'defaultOrder' => ['id'=> SORT_DESC],
],
]);

$dataProvider->pagination->pageSize = 10;  //让列表显示分页,每页显示10条

if (!$this->validate()) {
return $dataProvider;
}

//一些需要的where条件
$query->andFilterWhere([
'id' => $this->id,
'charger_id' => $this->charger_id,
'auth_status' => $this->auth_status,
'paystatus' => $this->paystatus,
'create_at' => $this->create_at,
'entry_status' => $this->entry_status,
]);

//当搜索期次grade_no   term.grade_no -> term.grade_no  hmy.class_id -> term.pid
if ($this->grade_no) {
$query->andFilterWhere(['=', $termNameAlias . '.grade_no', $this->grade_no])
->andFilterWhere(['=', $termNameAlias . '.pid', $this->class_id]);
} else if ($this->class_id){
//当搜索班型 - 不显示父级班型, 只显示子集的  hmy.class_id -> term.pid
$query->andFilterWhere(['=', $termNameAlias . '.pid', $this->class_id]);
}

if ($this->class_no) {
//当搜索班级 - class_no  class.class_no  -> class.class_no
$query->andFilterWhere(['=', $classNameAlias . '.class_no', $this->class_no]);
}

//一些相关的like模糊查询
$query->andFilterWhere(['like', 'crm_hmy' . '.truename', $this->truename])
->andFilterWhere(['like', 'crm_hmy' . '.mobile', $this->mobile])
->andFilterWhere(['like', 'crm_hmy' . '.weixin', $this->weixin])
->andFilterWhere(['like', 'position', $this->position])

return $dataProvider;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: