牛骨文教育服务平台(让学习变的简单)
博文笔记

Yii2实现让关联字段支持搜索功能的方法

创建时间:2016-10-13 投稿人: 浏览次数:164

直接上代码

感谢 老胡哥,分享代码,记录一下,方便学习,且分享给大家

https://github.com/hubeiwei/hello-yii2/blob/2.0/models/search/SettingSearch.php
https://github.com/hubeiwei/hello-yii2/blob/2.0/modules/backend/views/setting/index.php

user主键id;setting表 外键updated_by

SettingSearch.php

<?php
namespace appmodelssearch;
use appmodelsSetting;
use appmodelsUser;
use yiiaseModel;
use yiidataActiveDataProvider;
/**
 * SettingSearch represents the model behind the search form about `appmodelsSetting`.
 */
class SettingSearch extends Setting
{
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [["id", "key", "value", "status", "description", "tag", "updated_by", "created_at", "updated_at", "username"], "safe"],
        ];
    }
    /**
     * @inheritdoc
     */
    public function attributes()
    {
        return array_merge(parent::attributes(), [
            "username",
        ]);
    }
    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return array_merge(parent::attributeLabels(), [
            "username" => "操作人",
        ]);
    }
    /**
     * @inheritdoc
     */
    public function scenarios()
    {
        // bypass scenarios() implementation in the parent class
        return Model::scenarios();
    }
    /**
     * Creates data provider instance with search query applied
     *
     * @param array $params
     *
     * @return ActiveDataProvider
     */
    public function search($params)
    {
        $query = self::find()
            ->from(["setting" => self::tableName()])
            ->select([
                "setting.*",
                "user.username",
            ])
            ->leftJoin(["user" => User::tableName()], "user.id = setting.updated_by");
        // add conditions that should always apply here
        $dataProvider = new ActiveDataProvider([
            "query" => $query,
        ]);
        $this->load($params);
        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where("0=1");
            return $dataProvider;
        }
        // grid filtering conditions
        $query->andFilterWhere([
            "setting.id" => $this->id,
            "setting.updated_by" => $this->updated_by,
            "user.username" => $this->getAttribute("username"),
        ]);
        $query->andFilterWhere(["like", "key", $this->key])
            ->andFilterWhere(["like", "value", $this->value])
            ->andFilterWhere(["like", "setting.status", $this->status])
            ->andFilterWhere(["like", "description", $this->description])
            ->andFilterWhere(["like", "tag", $this->tag]);
        $query->timeRangeFilter("setting.created_at", $this->created_at, false)
            ->timeRangeFilter("setting.updated_at", $this->updated_at, false);
        return $dataProvider;
    }
}

index.php

<?php
use appmodelsSetting;
use appmodulescorehelpersRenderHelper;
use appmodulescorewidgetDateRangePicker;
use yiihelpersHtml;
use kartikgridSerialColumn;
use kartikgridActionColumn;
/**
 * @var $this yiiwebView
 * @var $searchModel appmodelssearchSettingSearch
 * @var $dataProvider yiidataActiveDataProvider
 */
$this->title = "网站配置";
$this->params["breadcrumbs"][] = ["label" => $this->title, "url" => ["index"]];
$gridColumns = [
    ["class" => SerialColumn::className()],
    [
        "attribute" => "id",
        "headerOptions" => ["width" => 80],
    ],
    "key",
    "value",
    "description",
    "tag",
    [
        "attribute" => "status",
        "value" => function ($model) {
            return Setting::$status_map[$model->status];
        },
        "filter" => RenderHelper::dropDownFilter("SettingSearch[status]", $searchModel->status, Setting::$status_map),
        "headerOptions" => ["width" => 100],
    ],
    "username",
    [
        "attribute" => "created_at",
        "format" => "dateTime",
        "filterType" => DateRangePicker::className(),
        "filterWidgetOptions" => [
            "dateOnly" => false,
        ],
        "headerOptions" => ["width" => 160],
    ],
    [
        "attribute" => "updated_at",
        "format" => "dateTime",
        "filterType" => DateRangePicker::className(),
        "filterWidgetOptions" => [
            "dateOnly" => false,
        ],
        "headerOptions" => ["width" => 160],
    ],
    ["class" => ActionColumn::className()],
];
?>
<div class="setting-index">

    <h1><?= Html::encode($this->title) ?></h1>

    <hr>

    <p>
        <?= Html::a("添加配置", ["create"], ["class" => "btn btn-info"]) ?>
    </p>

    <?= RenderHelper::gridView($dataProvider, $gridColumns, $searchModel) ?>
    
</div>

效果图


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。