webinar
@webinar
Учим yii: https://youtu.be/-WRMlGHLgRg

Как составить search Model для MultilingualBehavior?

Есть поведение: https://github.com/OmgDef/yii2-multilingual-behavior

Для интернационализации. Напрочь выключило логику мне. Не могу serchModel сделать. Для стандартного gridView дописать стандартный SearchModel.

Вот в обычной модели подключено поведение:
public function behaviors()
    {
        return [
            'ml' => [
                'class' => MultilingualBehavior::className(),
                'languages' => [
                    'ru' => 'ru',
                    'en-US' => 'en',
                    'fr' => 'fr',
                ],
                'defaultLanguage' => 'en',
                'langForeignKey' => 'courses_cat_id',
                'tableName' => "{{%courses_cat_lang}}",
                'attributes' => [
                    'title', 'desc',
                ]
            ],
        ];
    }

Там же связи добавил, така как через поведение хз как сделать:
public function getFr(){
        return $this->hasOne(CoursesCatLang::className(),['courses_cat_id'=>'id'])->andWhere(['language'=>'fr']);
    }

    public function getRu(){
        return $this->hasOne(CoursesCatLang::className(),['courses_cat_id'=>'id'])->andWhere(['language'=>'ru']);
    }

    public function getEn(){
        return $this->hasOne(CoursesCatLang::className(),['courses_cat_id'=>'id'])->andWhere(['language'=>'en']);
    }

Вот search, как я его видел:
public function search($params)
    {
        $query = CoursesCat::find();
          $query->joinWith([
               'fr' => function ($q) {
               $q->from(['fr' => 'courses_cat_lang']);
               },
          ]);

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);

        if (!$this->validate()) {
            return $dataProvider;
        }

        $query->andFilterWhere(['like', 'en.title', $this->title])
            ->andFilterWhere(['like', 'ru.title', $this->title_ru])
            ->andFilterWhere(['like', 'fr.title', $this->title_fr])
        return $dataProvider;
    }

C fr.title все норм работает, не могу понять как добавить другие связи.
пробовал так:
$query->joinWith([
       'fr' => function ($q) {
           $q->from(['fr' => 'courses_cat_lang']);
       },
   ])->joinWith([
       'ru' => function ($q) {
           $q->from(['ru' => 'courses_cat_lang']);
       },
   ]);

получаю:
SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'language' in where clause is ambiguous
The SQL being executed was: SELECT COUNT(*) FROM `courses_cat` LEFT JOIN `courses_cat_lang` `fr` ON `courses_cat`.`id` = `fr`.`courses_cat_id` LEFT JOIN `courses_cat_lang` `ru` ON `courses_cat`.`id` = `ru`.`courses_cat_id` WHERE (`language`='fr') AND (`language`='ru')
  • Вопрос задан
  • 253 просмотра
Решения вопроса 1
webinar
@webinar Автор вопроса, куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Вообщем вышел из ситуации так:
в основной моделе 1 связь:
public function getTrans(){
        return $this->hasOne(CoursesCatLang::className(),['courses_cat_id'=>'id']);
    }

в search модели:
public function search($params)
    {
        $query = CoursesCat::find()->multilingual()->joinWith(['trans']);
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);

        if (!$this->validate()) {
            return $dataProvider;
        }

        if($this->title_en){
            $query->andFilterWhere(['courses_cat_lang.language'=>'en']);
        }elseif ($this->title_ru) {
            $query->andFilterWhere(['courses_cat_lang.language'=>'ru']);
        }elseif ($this->title_fr){
            $query->andFilterWhere(['courses_cat_lang.language'=>'fr']);
        }

        $query->andFilterWhere(['like', 'courses_cat_lang.title', $this->title_en])
            ->andFilterWhere(['like', 'courses_cat_lang.title', $this->title_ru])
            ->andFilterWhere(['like', 'courses_cat_lang.title', $this->title_fr]);
        return $dataProvider;
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Sabotage123
public function search($params)
{
$query = City::find()->active()->joinWith('translations');
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);

if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
if($this->word){
$query->andFilterWhere([
'or',
['like', 'courses_cat_lang.title', $this->word],
]);
}

return $dataProvider;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы