Yii2 Сортировка и фильтрация из связанной таблицы через таблицу - PullRequest
0 голосов
/ 04 июля 2018

Добрый день всем. Я пытаюсь добавить фильтр для соответствующего поля phone_digital, но получаю следующую ошибку enter image description here

Структура -

1 таблица - ClientClient - имя, отчество, фамилия, возраст.
2 таблица - ClientPhone - client_id, phone_digital.

ClientClient (модель)

class ClientClient extends \yii\db\ActiveRecord
{
public static function tableName(){
    return 'client_client';
}
public function rules(){
    return [
        [['age'], 'integer'],
        [['first_name', 'patronymic', 'last_name'], 'string', 'max' => 255],
    ];
}
public function attributeLabels(){
    return [
        'id' => 'ID',
        'first_name' => 'First Name',
        'patronymic' => 'Patronymic',
        'last_name' => 'Last Name',
        'age' => 'Age',
        'phone_digital' => 'Phone Digital',
    ];
}
public function getclientPhone(){
    return $this->hasOne(clientPhone::class, ['client_id' => 'id']);
}
public function getPhone(){
    return $this->hasOne(clientPhone::class, ['phone_digital' => 'id']);
}
public function getDigital(){
    return $this->hasOne(ClientPhone::className(), ['id' => 'phone_digital']);
}
public function getPhoneDigital(){
    return $this->phone->phone_digital;
}
}

ClientSearch (модель)

class ClientSearch extends Clientclient
{
public $phonedigital;
public function rules(){
    return [
        [['id', 'age'], 'integer'],
        [['first_name', 'phonedigital', 'patronymic', 'last_name'], 'safe'],
    ];
}
public function scenarios(){
    // bypass scenarios() implementation in the parent class
    return Model::scenarios();
}
public function search($params){
    $query = Clientclient::find()->orderBy('phone_digital');
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        ]);
    if (!($this->load($params) && $this->validate())) {
        return $dataProvider;
    }
    $query->joinWith(['phonedigital' => function($query) { $query->from(['phonedigital' => 'ClientPhone']); }]);
    $dataProvider->sort->attributes['phone'] = [
        'asc' => ['phonedigital.phone_digital' => SORT_ASC],
        'desc' => ['phonedigital.phone_digital' => SORT_DESC],
    ];
    $query->andFilterWhere([
        'id' => $this->id,
        'age' => $this->age,
    ]);
    $query->andFilterWhere(['like', 'first_name', $this->first_name])
        ->andFilterWhere(['like', 'patronymic', $this->patronymic])
        ->andFilterWhere(['like', 'last_name', $this->last_name])
        ->andFilterWhere(['like', 'phonedigital.phone_digital', $this->getAttribute('phonedigital')]);

    return $dataProvider;
}
}

Что мне нужно сделать, чтобы сделать эту работу?

1 Ответ

0 голосов
/ 04 июля 2018

Полагаю, вы должны разместить свой заказ после вашего присоединения проверьте закомментированные строки:

public function search($params){
// do not put the join of a related table at the beginning because it's not related yet
    $query = Clientclient::find(); 
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        ]);
    if (!($this->load($params) && $this->validate())) {
        return $dataProvider;
    }
    $query->joinWith(['phonedigital' => function($query) { $query->from(['phonedigital' => 'ClientPhone']); }]);

// orderBy only after call the relacion
    $query->orderBy('phonedigital.phone_digital'); 

    $dataProvider->sort->attributes['phone'] = [
        'asc' => ['phonedigital.phone_digital' => SORT_ASC],
        'desc' => ['phonedigital.phone_digital' => SORT_DESC],
    ];
    $query->andFilterWhere([
        'id' => $this->id,
        'age' => $this->age,
    ]);
    $query->andFilterWhere(['like', 'first_name', $this->first_name])
        ->andFilterWhere(['like', 'patronymic', $this->patronymic])
        ->andFilterWhere(['like', 'last_name', $this->last_name])
        ->andFilterWhere(['like', 'phonedigital.phone_digital', $this->getAttribute('phonedigital')]);

    return $dataProvider;
}

Надеюсь, это вам поможет, и извините за мои ошибки

...