public function searchWithRelated() {
$criteria = new CDbCriteria;
$criteria->together = true; //without this you wont be able to search the second table's data
$criteria->with = array('mySecondTable');
$criteria->compare('id', $this->id, true);
$criteria->compare('mySecondTable.column', $this->mySecondTable_column, true);
return new CActiveDataProvider($this, array(
'criteria' => $criteria,
'sort'=>array(
'defaultOrder'=>'t.create_time DESC',
),
'pagination' => array(
'pageSize' => 100,
),
));
}php
高級應用程序模板
這個模板用在大型的團隊開發項目中,並且後臺從前臺獨立分離出來以便於部署在多個服務器中。因爲YIi2.0的一些新的特性,這個程序模板的功能要更深一點。提供了基本的數據庫的支持,註冊、密碼找回等功
能夠經過Composer來安裝
若是沒有安裝Composer,先安裝html
curl -s http://getcomposer.org/installer | php
而後用以下命令來獲取前端
php composer.phar create-project --prefer-dist --stability=dev yiisoft/yii2-app-advanced /path/to/yii-application
也能夠直接下載壓縮文件:Yii 2 with advanced application template(beta)
https://github.com/yiisoft/yii2/ ... -app-2.0.0-beta.tgz
開始
安裝完成後,須要對其進行初始化操做。node
php /path/to/yii-application/init
yii migrate
目錄結構
在根目錄下面有這幾個子目錄git
根目錄下面還有包含一些文件github
系統定義的路徑別名web
應用程序
這個模板包含三個應用程序,前臺、後臺和控制檯。前臺一般來講就是展示給終端用戶的,也就是項目自己。後臺就是管理員控制面板,包含有分析以及相似的功能等。控制檯主要用來作一些定時任務和一些簡單的服務器的管理,另外也能夠用來部署應用程序、數據庫的遷移、資源的管理等。
common 目錄提供一些公共的文件,可用於多個應用程序,例如User模型。
前臺和後臺都是web應用程序,他們都包含一個web目錄,也就是web的根目錄,在部署服務器的時候就得要指向這個目錄。
每一個應用程序都有他們本身的命名空間以及對應的別名。同理,common也有本身的命名空間和對應的別名。
配置和開發環境
在日常的開發中,直接設置配置文件會有多個問題數據庫
爲了解決這些問題,Yii引入了一個很是簡單的環境的概念。每一個環境由環境目錄下的一組文件的集合來表示。init命令用於不一樣環境之間切換。它只是複製從環境目錄中全部應用程序的根目錄。
一般環境包含應用程序引導文件如index.php和以-local.php後綴的配置文件。這些已經添加到.gitignore中,因此不會再添加到源碼倉庫中。
爲了不重複的配置文件相互覆蓋。例如,前臺應用程序按照如下順序來讀取配置:json
參數文件按如下順序讀取bootstrap
後面讀取的文件配置會覆蓋前面的配置
整個的流程圖形以下
配置 Composer
應用程序安裝完成後就能夠設置要目錄下面的composer.json
首先,修改一些基本信息。例如名稱,描述,關鍵詞,主頁等等。
你還能夠根據你的須要添加更多的應用程序。這些包都是來自packagist.org,可免費的瀏覽全部的代碼。
修改完composer.json以後 就能夠運行
php composer.phar update --prefer-dist
,等下載並安裝完成後就能夠開始使用了。自動加載的類將會自動處理。
建立從後端到前端的連接
一般狀況下須要從後端應用程序鏈接到前端應用程序。由於前端應用程序可能包含本身的URL管理規則,因此須要再添加一個不一樣名字的後臺的URL管理規則。
以後,就能夠像這樣來使用前臺的url
Reference: Learn Yii Framework online – CGridView filter with relational field
Model:
1. 添加filter用的屬性
var $a = 「」;
var $b = 「」;
2. 修改rules方法中的配置
array(‘……., a, b’, ‘safe’, ‘on’=>’search’);
3. 注意relations方法
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
‘xxx‘ => array(self::HAS_ONE, ‘xxxModel’, array(‘…’ => ‘….’)),
);
}
4. 修改search()方法添加行
$criteria->compare(‘xxx.ax‘,$this->a);
$criteria->compare(‘xxx.bx‘,$this->b);
View
1. ‘dataProvider’=>$model->with(「xxx「)->search(),
2. 列展現修改
array(
‘name’ => ‘a‘,
‘value’ => ‘$data->xxx->ax‘,
‘filter’ => array(select的下來菜單數組),
),
array(
‘name’ => ‘b‘,
‘value’ => ‘$data->xxx->bx‘,
‘filter’ => array(1 => 「Set」, 0 => ‘Not Set’),
),
代碼提示:
1. 添加的兩個屬性僅僅用於記錄頁面的搜索條件
2. search方法中的CDbCriteria搜索方法沒有任何變化,請學習如何使用關聯搜索
$criteria = new CDbCriteria;
//select
$criteria->select = '*';//默認*
$criteria->select = 'id,name';//指定的字段
$criteria->select = 't.*,t.id,t.name';//鏈接查詢時,第一個表as t,因此用t.*
$criteria->distinct = FALSE; //是否惟一查詢
//join
$criteria->join = 'left join table2 t2 on(t.id=t2.tid)'; //鏈接表
$criteria->with = 'xxx'; //調用relations
//where 查詢數字字段
$criteria->addCondition("id=1"); //查詢條件,即where id = 1
$criteria->addBetweenCondition('id', 1, 4);//between 1 and 4
$criteria->addInCondition('id', array(1,2,3,4,5)); //表明where id IN (1,23,,4,5,);
$criteria->addNotInCondition('id', array(1,2,3,4,5));//與上面正好相法,是NOT IN
//where 查詢字符串字段
$criteria->addSearchCondition('name', '分類');//搜索條件,其實表明了。。where name like '%分類%'
//where 查詢日期字段
$criteria->addCondition("create_time>'2012-11-29 00:00:00'");
$criteria->addCondition("create_time<'2012-11-30 00:00:00'");
//where and or
$criteria->addCondition('id=1','OR');//這是OR條件,多個條件的時候,該條件是OR而非AND
//這個方法比較特殊,他會根據你的參數自動處理成addCondition或者addInCondition,
//即若是第二個參數是數組就會調用addInCondition
$criteria->compare('id', 1);
/** * 傳遞參數 */
$criteria->addCondition("id = :id");
$criteria->params[':id']=1;
//order
$criteria->order = 'xxx DESC,XXX ASC' ;//排序條件
//group
$criteria->group = 'group 條件';
$criteria->having = 'having 條件 ';
//limit
$criteria->limit = 10; //取1條數據,若是小於0,則不做處理
$criteria->offset = 1; //兩條合併起來,則表示 limit 10 offset 1,或者表明了。limit 1,10
<?php $this->widget('zii.widgets.grid.CGridView', array( 'id'=>'chapter-grid', 'dataProvider'=>$model->search(), //數據結果集 'filter'=>$model, 'columns'=>array( 'id', //錨點<a href="http://www.gulianqiang.com/"></a> array( 'name'=>'name', 'type'=>'raw', 'value'=>'CHtml::link($data->name,"/book/$data->id")', ), //圖片 array( 'name'=>'image', 'type'=>'image', 'value'=>'LImages::getPath("book").$data->image',//圖片相對路徑 ), //下拉列表 array( 'name'=>'type', 'value'=>'Lookup::item("chapterType",$data->type)', 'filter'=>Lookup::items('chapterType'), ), //內容截取 array( 'name'=>'content', 'type'=>'html', 'value'=>'mb_substr(htmlspecialchars_decode($data->content),0,100,"utf-8")', ), //時間 array( 'name'=>'create_time', 'type'=>'datetime', ), // 根據相關信息讀數據庫 array( 'name'=>'user_id', 'value'=>'User::model()->findbyPk($data->user_id)->username', 'filter'=>false, ), array( 'class'=>'CButtonColumn', ), ),)); ?>