我有模型帖子,它是可搜索和可翻译的,我也想对翻译应用搜索。
对于翻译,我使用 Laravel Voyager 的默认翻译,我相信它与 https://docs.astrotomic.info/laravel-translatable/package/interface,
相同搜索在默认语言下完美运行,但是当我尝试在我的案例中应用 Scout 建议的解决方案时,出现此错误
SQLSTATE[23000]:违反完整性约束:1052 order 子句中的列“id”不明确
这是我使用的查询:
select *
from `posts`
inner join `translations` on `posts`.`id` = `translations`.`foreign_key`
and `translations`.`column_name` = 'body'
and `translations`.`table_name` = 'posts'
where (`posts`.`title` like %დოლორეს%
or `posts`.`body` like %დოლორეს%
or `translations`.`value` like %დოლორეს%)
order by `id` desc
这是我的模型
class Post extends \TCG\Voyager\Models\Post
{
use Searchable;
use Translatable;
protected $translatable = ['title', 'body', 'excerpt'];
public function toSearchableArray(): array
{
return [
'title' => $this->title,
'body' => $this->body,
'translations.value' => ' '
];
}
}
这是控制器
$posti=Post::search(\request('search'))->query(function ($builder) {
$builder->join('translations',function ($join) {
$join->on('posts.id', '=', 'translations.foreign_key')
->where('translations.column_name', '=', DB::raw("'body'"))
->where('translations.table_name','=',DB::raw("'posts'"));
});
// ->where('table_name','=','posts');
})->get();
任何帮助将不胜感激
我尝试使用这个解决方案 点击这里
因此,问题在于,在加入 Posts 和 Translations 表时,由于名称相同,帖子 ID 被翻译 ID 替换。
解决方案是仅从 Translations 表中选择必要的列,显然不要选择 ID 列。
这是最终的工作代码:
$post = Post::search(\request('search'))->query(function ($builder) {
$builder->select([
'posts.*',
'translations.table_name',
'translations.column_name',
'translations.foreign_key',
'translations.value',
'translations.locale',
])->where('posts.status','PUBLISHED')
->join('translations', function ($join) {
$join->on('posts.id', '=', 'translations.foreign_key');
})
->where('translations.table_name', '=', 'posts')->where(function($query) {
$query->where('translations.column_name','body')
->orWhere('translations.column_name','title');
});
})->orderBy($column ?? 'id' , $order ?? 'asc')->get();
$test = $post->unique('id');
最后一行
$test = $post->unique('id');
是必要的,以避免在“正文”和“标题”中找到可搜索单词时出现重复结果