yii多表查詢--學習隨筆

今天自己做一個小demo,為了不要冗余字段,需要進行多表聯合查詢、搜索

yii中,用model來映射數據庫(其實好多框架都是這么搞的),一個模型類通常有一個search模型類跟著一起

廢話不多說了,首先,數據庫里有布置一張表,我習慣讓數據表之間相互獨立,建表的時候沒有添加外鍵約束,而是采用?u_id、a_id?等字段來表示關聯關系;

下圖是我設計表格中常常包括的字段

上面的表為一個join報名表,u_id是報名用戶的id,j_id是報名項目的id,a_id是該項目負責人的id,分別關聯了三張表

通過Gii生成的默認首頁表單不包括其他三張表的內容,這里不贅述,要實現如下效果:

需要對如下幾個文件進行修改:

  1. 本頁對應model、修改是增加相應的get方法
  2. 對應的modelSearch、修改是把關聯加進去,用于搜索
  3. 首頁視圖的修改,替換原來的U ID、J ID、A ID等

一、修改model,增加get方法

yii中,get方法實際上可以理解成往model對象中增加新的屬性、方法,也就是添加與其他表的映射關系

  /*** 根據u_id獲取用戶信息*/public function getUser(){return $this->hasOne(User::className(), ['id' => 'u_id']);}

二、修改modelSearch,加入關聯查詢

...其他代碼...//增加成員屬性(增加的查詢字段)public $real_name;
//在ruler規則中添加
[['real_name'], 'safe'],
//在search方法中 
...
//增加查詢表 也就是要和哪張表一起查
$query->joinWith(['user']);

...
$query->andFilterWhere(['like', 'user.real_name', $this->real_name]); 
...

//設置搜索同時給新增的選項添加排序規則
//注意是重寫,所以要加上原來有的項目


$dataProvider->setSort(['attributes' => [
      
'id',
      'expectation',
      'work_time',
      'status',
      'real_name' => [
        'asc' => ['user.real_name' => SORT_ASC],
        'desc' => ['user.real_name' => SORT_DESC],
        'label' => 'user.real_name' ],
      ]
     ]
    ]);

return $dataProvider;

setSort是為在首頁表上顯示的字段提供排序的規則,它自己的有,新加入的需要添加一下,會覆蓋原有的,所以模型本來的字段不能漏,否則無法按該字段排序

三、修改view

看代碼,這個是視圖文件中的index.php文件,也就是修改GridView

<?= GridView::widget(['dataProvider' => $dataProvider,'filterModel' => $searchModel,'columns' => ['id',//'u_id',
                ['attribute' => 'real_name','value' => 'user.real_name','label' => '用戶'],'expectation','work_time','status',['class' => 'yii\grid\ActionColumn'],],]); ?>

這樣就可以搜索了,也可以排序的哦

文筆不好,有不妥當之處歡迎交流 ^_^

轉載于:https://www.cnblogs.com/huyujun/p/9604333.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250714.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250714.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250714.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

node --- 創建一個Socket服務器

流程: 會開發一個監聽文件改變的應用然后客戶端使用命令行工具(telnet)連接服務端服務端在監聽到文件變化后,會發送數據給客戶端 監聽文件變化 node 的fs模塊:watch方法用于監聽文件的變化,可以在內存分配一個區域,來專門用于監聽文件變化,并執行該區域內指定的回調函數 //…

Laravel中數據庫的操作

查找數據庫的三種方式 DB facade(原始查找)查詢構造Eloquent ORM新建數據表 //示例表 create table if not exits student( ‘id’ int auto_increment primaary key, ‘name’ varchar(255) not null default “”comment’姓名’, ‘age’ tinyint usigned not null defa…

node --- 創建一個Socket客戶端連接到服務器

描述: net.createrServer().listen(60300) 監聽客戶端訪問net.connect({ port: 60300 }) 訪問服務器 服務器: 一個很簡單的監聽文件改變的服務器每當監聽的文件改變了,將信息通過json的格式傳遞給連接到的客戶端 connection.write // 01、net-watcher.js use strict const …

Laravel中的Blade模版

Blade模版簡介 Blade模版的好處&#xff1a; 模版繼承&#xff08;template inheritance&#xff09;視圖片段&#xff08;sections&#xff09;部分指令&#xff1a; extend(‘xxx’)為子頁面指定所繼承的頁面布局模版section(‘xxx’)為子頁面提供所繼承的頁面中指定的部分…

三元表達式,列表解析和生成器表達式

三元表達式 在以前&#xff0c;在諸如比較兩個數大小的時候&#xff0c;通常的寫法都是下面的樣子 if x > y:print("the max is x") else:print("the max is y") 三元表達式的語法為&#xff1a; True if expression else False 現在可以個體三元表達式…

Mysql 如何設置字段自動獲取當前時間,附帶添加字段和修改字段的例子

--添加CreateTime 設置默認時間 CURRENT_TIMESTAMP ALTER TABLE table_nameADD COLUMN CreateTime datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT 創建時間 ; --修改CreateTime 設置默認時間 CURRENT_TIMESTAMP ALTER TABLE table_nameMODIFY COLUMN CreateTime datetim…

css --- 圣杯布局

圣杯布局 左右固定寬度,中間自適應div:nth-child(1) section {display: flex;width: 60%;height: 150px;background-color: pink;margin: 0 auto; }section div:nth-child(1) {width: 100px;height: 150px;background-color: red; }section div:nth-child(2) {flex: 1;backgr…

FZU OJ:2230 翻翻棋

Problem 2230 翻翻棋Accept: 872 Submit: 2132Time Limit: 1000 mSec Memory Limit : 32768 KBProblem Description象棋翻翻棋&#xff08;暗棋&#xff09;中雙方在4*8的格子中交戰&#xff0c;有時候最后會只剩下帥和將。根據暗棋的規則&#xff0c;棋子只能上下左右移…

關于字符串比較時候出現的空指針問題的坑

比如說&#xff1a;String Tname driver.getTrueName(&#xff09;; 這個變量是從driver對象中取出的&#xff0c;但是你不知道這個值是空值null&#xff1b; 這個時候如果你這么寫&#xff1a;Tname.equals("張三") 這個時候就會報空指針異常的 修改&#xff1a…

PHP 實現快速排序

首先了解快速排序的原理&#xff1a; 1、先取一個基值&#xff0c;用于每次的標準定位。 2、遍歷數組&#xff0c;將大于基值的放到右邊數組&#xff0c;小于的放到左邊數組 3、將每次的左右數組和基值一起合并 代碼實現&#xff1a; //快速排序 function quick_sort($arr…

css --- flex:n的解析

起步 效果如下: 在父元素中,將3個盒子平均分成了3等份代碼如下: p span {flex: 1;background-color: lightcoral; }p span:nth-child(even) {border-right: 1px solid black;border-left: 1px solid black; }假設有3個子元素flex:1 的意思是,將剩余的寬度平均分成3份,然后該元…

1070: [SCOI2007]修車

/*一開始以為是個貪心 發現自己太naive了將每個技術工人拆成n個點&#xff0c;一共拆n*m個&#xff0c;第i個表示倒數第i次修車。 讓每輛車向拆出來的點連邊&#xff0c;費用為tmp[i][j]*k&#xff0c;i是技工&#xff0c;j是車&#xff0c;k是拆出來的第幾個點&#xff0c; 這…

PHP 實現冒泡排序

PHP 實現冒泡排序 直接上代碼 //冒泡排序 function bubble_sort($array){$count count($array);if ($count<0) {return false;}for ($i0; $i <$count ; $i) { for ($j0; $j <$count-$i-1 ; $j) { if ($array[$j]>$array[$j1]) {$tmp $array[$j1];$array[$j1]$a…

node --- 后端使用bcrypt對密碼進行加密處理

密碼的處理 加密處理在線調試: http://www.atool9.com/hash.phpbcrypt: 加密工具安裝 && 使用 npm install --save bcryptconst bcrypt require(bcrypt); const SALT_WORK_FACTOR 10;const UserSchema new Schema({UserId: {type: ObjectId},password: String })U…

統一建模語言UML

目錄 1. UML定義2. UML結構2.1 視圖&#xff08;View&#xff09;2.2 圖&#xff08;Diagram&#xff09;2.3 模型元素&#xff08;Model element&#xff09;2.4 通用機制&#xff08;General mechanism&#xff09;3. 類圖3.1 類與類圖3.2 類之間的關系3.2.1 關聯關系3.2.2 聚…

SpringCloud系列七:使用Ribbon實現客戶端側負載均衡

1. 回顧 在前面&#xff0c;已經實現了微服務的注冊與發現。啟動各個微服務時&#xff0c;Eureka Client會把自己的網絡信息注冊到Eureka Server上。 但是&#xff0c;在生成環境中&#xff0c;各個微服務都會部署多個實例&#xff0c;因此還行繼續進行優化。 2. Ribbon簡介 Ri…

node --- 使用koa-router,讓后端模塊化

使用Koa-router進行路由管理 npm install --save koa-router const Router require(koa-router); let router new Router(); router.get(/, async (ctx)>{ctx.body 用戶操作首頁 })路由模塊化 在appApi下面創建需要模塊化的文件如:home.js、user.js const Router re…

PHP 實現桶排序

PHP 實現桶排序 <?phpfunction Bucket_sort($array){//初始化桶大小$min min($array);$max max($array);$book array_fill($min, $max-$min1, 0);//將要進行的數據進行計數foreach ($array as $key) {$book[$key];// echo $book[$key];}//返回數據$resArr array();for…

springboot ajax返回html

因為攔截器 或者是 shiro 攔截登陸接口 轉載于:https://www.cnblogs.com/xdcr/p/9638569.html

【小試牛刀】短信驗證碼(隨機數)的生成實現

短信驗證碼&#xff0c;相信在生活中大家是幾乎天天能夠遇到。但你知道它是怎樣生成的嗎&#xff1f;其實它就是若干位數的隨機數組合而成。下面附上一小段程序&#xff0c;供大家一起學習交流。package com.fhcq.util;import org.apache.commons.lang3.RandomStringUtils;publ…