Добрый день, проблемы с добавление поля поиска по элементам с другой таблицы. То есть имеется 2 таблицы offer и advertiser, они связаны как hasOne id=>advertiser_id в таблице advertiser есть поле advertiser_name, которое я вывожу в gridview на главной странице offer. Как показано на рисунке, в offer_name, id есть поиск, а у advertiser_name нету. Искал всевозможные гайди по этому, но ничего не нашёл. Понял, что нужно добавить правило, advertiser_name в rules в таблице OfferSearch, но он его не добавляет. Скорей всего его нужно добавить в andFilterWhere, но там он не видит advertiser_name. Попробовал сделать ещё одну связь, PHP: public function getAdd() { return $this->hasOne(Advertiser::className(), ['id'=> 'advertiser_id'])->select(['id', 'advertiser_name']); } Но всё ровно не видит. Прикладываю фото
возможно это то, но в кривой реализации PHP: /** * Creates data provider instance with search query applied * * @param array $params * * @return ActiveDataProvider */ public function search($params) { $query = Timetable::find()-> select('`zlx_timetable`.*, `zlx_rooms`.`name`, `zlx_users`.`fio`, `zlx_users`.`email`, `zlx_users`.`mobilePhone`')-> leftJoin('zlx_rooms', '`zlx_rooms`.`id` = `zlx_timetable`.`roomId`')-> leftJoin('zlx_users', '`zlx_users`.`id` = `zlx_timetable`.`userId`'); $dataProvider = new ActiveDataProvider([ 'query' => $query->orderBy(['id'=>SORT_DESC]), ]); $this->load($params); if (!$this->validate()) { // uncomment the following line if you do not want to any records when validation fails // $query->where('0=1'); return $dataProvider; } $query->andFilterWhere([ //'id' => $this->id, 'active' => $this->active, 'status' => $this->status, 'roomId' => $this->roomId, 'userId' => $this->userId, ]); $query->andFilterWhere(['=', 'zlx_timetable.id', $this->id]); $query->andFilterWhere(['like', 'prePayInfo', $this->prePayInfo]); $query->andFilterWhere(['>=', new Expression('DATE(zlx_timetable.startAt)'), $this->startAt ]); $query->andFilterWhere(['>=', new Expression('DATE(zlx_timetable.createAt)'), $this->createAt ]); $query->andFilterWhere(['like', 'zlx_rooms.name', $this->name ]); $query->andFilterWhere(['like', 'zlx_users.email', $this->email ]); $query->andFilterWhere(['like', 'zlx_users.fio', $this->fio ]); $query->andFilterWhere(['like', 'zlx_users.mobilePhone', $this->mobilePhone ]); return $dataProvider; }
Спасибо, я понял как делать, вот что получилось) Всё работает PHP: class OfferSearch extends Offer { public $advertiser; /** * @inheritdoc */ public function rules() { return [ [['id', 'advertiser_id'], 'integer'], [['offer_name', 'advertiser'], 'safe'], ]; } /** * @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 = Offer::find()->joinWith('advertiser') // ->where(['like', 'advertiser.advertiser_name', 'lead']); $query = Offer::find(); $query->joinWith(['advertiser']); // // add conditions that should always apply here $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); $dataProvider->sort->attributes['advertiser']=[ 'asc'=>['advertiser.advertiser_name'=>SORT_ASC], 'desc' => ['advertiser.advertiser_name' => SORT_DESC], ]; $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([ 'id' => $this->id, 'advertiser_id' => $this->advertiser_id, ]); $query->andFilterWhere (['like', 'offer_name', $this->offer_name,]) ->andFilterWhere(['like', 'advertiser_name', $this->advertiser]); return $dataProvider; } }
Для поиска по полю другой таблицы(не просто отображения) в поисковой модели сначала нужно обьявить поля из этой таблицы и добавить их в валидацию и фильтры. Например PHP: class SaleSearch extends Sale { public $fullname; public $client_email; public $course_title; public $course_price; public $subscribe_status; /** * @inheritdoc */ public function rules() { return [ [['id', 'created_at', 'updated_at'], 'integer'], [['sale_status', 'method', 'fullname', 'client_email', 'course_title' , 'course_price', 'subscribe_status'], 'safe'], ]; } /** * @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 = Sale::find()->joinWith(['client', 'course']); // add conditions that should always apply here $dataProvider = new ActiveDataProvider([ 'query' => $query->asArray(), 'pagination' => [ 'pageSize' => 10, ], ]); $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([ 'id' => $this->id, 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]); $query->andFilterWhere(['like', 'sale_status', $this->sale_status]); $query->andFilterWhere(['like', 'client.email', $this->client_email]); $query->andFilterWhere(['like', 'course.title', $this->course_title]); $query->andFilterWhere(['like', 'course.price', $this->course_price]); $query->andFilterWhere(['like', 'client.subscribed', $this->subscribe_status]); $query->andWhere('client.fname LIKE "%' . $this->fullname . '%" ' . 'OR client.lname LIKE "%' . $this->fullname . '%"'); $query->andFilterWhere(['like', 'sale_status', $this->sale_status]); return $dataProvider; } Таким же способом можно создавать вспомагательные поля для удобства поиска(например при работе с timestamp) см. пример https://github.com/avs123a/yii2-shop2/blob/master/backend/models/ProductSearch.php