OmgDef / yii2-multilingual-behavior

Yii2 port of the yii-multilingual-behavior.
146 stars 60 forks source link

MultilingualQuery()->find()->localized() method does not respect languageField setting #38

Closed euglv closed 6 years ago

euglv commented 9 years ago

Hello, I want to make GRUD generated code to work with multilingual fields. I have object table with primary key id and some other fields, and object_lang table with objectId field that links to object table, lang field that stores language and name, title, description fields with translated information about object table record.

I changed generated Object model class:

// Added method:
public function behaviors()
{
    return [
        'ml' => [
            'class' => \omgdef\multilingual\MultilingualBehavior::className(),
            'languages' => ['uk', 'ru', 'en',],
            'languageField' => 'lang',
            //'defaultLanguage' => Yii::$app->language,
            'langForeignKey' => 'objectId',
            'tableName' => "object_lang",
            'attributes' => [
                'name', 'title', 'shortDescription', 'description', 'address'
            ]
        ],
    ];
}

// Changed method:
public static function find()
{
    return (new \omgdef\multilingual\MultilingualQuery(get_called_class()))->localized();
}

And get error, when trying to view object record:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'language' in 'where clause'
The SQL being executed was: SELECT * FROM `object_lang` WHERE (`language`='uk') AND (`objectId`=1)

I believe, query should be this: "SELECT * FROM object_lang WHERE (lang='uk') AND (objectId=1)", because I added 'languageField' => 'lang', option to behavior configuration.

If I change model's find method to this:

public static function find()
{
    //return (new \omgdef\multilingual\MultilingualQuery(get_called_class()))->localized();
    return (new \omgdef\multilingual\MultilingualQuery(get_called_class()))->multilingual();
}

Then everything works, as expected, multilingual() method respects languageField setting. In my application language is passed in url, so I do not want my model to have both description, description_uk, description_ru and description_en fields by default. These fields could have a huge html inside and unnecessary translated data can cause a performance problems.

OmgDef commented 9 years ago

@euglv Hello! You should create your own ActiveQuery class and override this property https://github.com/OmgDef/yii2-multilingual-behavior/blob/master/src/MultilingualTrait.php#L16