/** * Applies a translatable index to a basic query. This scope will join the index * table and cannot be executed more than once. * @param Builder $query * @param string $index * @param string $value * @param string $locale * @return Builder */ public function scopeTransWhere($query, $index, $value, $locale = null) { if (!$locale) { $locale = $this->translatableContext; } $query->select($this->model->getTable() . '.*'); $query->where(function ($q) use($index, $value) { $q->where($this->model->getTable() . '.' . $index, $value); $q->orWhere(function ($q) use($index, $value) { $q->where('rainlab_translate_indexes.item', $index)->where('rainlab_translate_indexes.value', $value); }); }); // This join will crap out if this scope executes twice, it is a known issue. // It should check if the join exists before applying it, this mechanism was // not found in Laravel. So options are block joins entirely or allow once. $query->leftJoin('rainlab_translate_indexes', function ($join) use($locale) { $join->on(Db::raw(DbDongle::cast($this->model->getQualifiedKeyName(), 'TEXT')), '=', 'rainlab_translate_indexes.model_id')->where('rainlab_translate_indexes.model_type', '=', get_class($this->model))->where('rainlab_translate_indexes.locale', '=', $locale); }); return $query; }