如何在多语言模型上使用 Laravel/Scout 和数据库驱动程序,

问题描述 投票:0回答:1

我有模型帖子,它是可搜索和可翻译的,我也想对翻译应用搜索。

对于翻译,我使用 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();

任何帮助将不胜感激

我尝试使用这个解决方案 点击这里

laravel search voyager laravel-scout laravel-translatable
1个回答
0
投票

因此,问题在于,在加入 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');
是必要的,以避免在“正文”和“标题”中找到可搜索单词时出现重复结果

© www.soinside.com 2019 - 2024. All rights reserved.