Таблица "язык"

id | name    | code
-------------------
1  | English | en
2  | German  | de

Таблица "статьи"

id | is_active
--------------
1  | 1
2  | 1

Таблица "article_translation"

article_id | language_id | title
-------------------------------------------
1          | 1           | foo
1          | 2           | title1 in German
2          | 1           | title2 in English
2          | 2           | foo

Предположим, я ищу «foo» с похожим условием и хочу получить результаты с language_id = 1, но мне все равно нужно искать заголовок на других языках. Следующие результаты, как я ожидал:

article_id | language_id | title
-------------------------------------------
1          | 1           | foo
2          | 1           | title2 in English

В laravel я пытался использовать группирование по функциям, но результаты не могут гарантировать, что language_id равен 1. Также необходимо установить строгий режим на false.

\App\ArticleTranslation::where('title', 'like', '%foo%')->groupBy('article_id')->paginate(10);
1
Wilson 25 Фев 2020 в 14:19

2 ответа

Лучший ответ
SELECT at1.*
FROM article_translation at1
JOIN article_translation at2 ON at1.article_id = at2.article_id 
WHERE at2.title = @title
  AND at1.language_id = @language_id 

играть на скрипке

PS . Конвертировать в Laravel самостоятельно ...

0
Akina 25 Фев 2020 в 11:27

Добавить отношения для простых запросов

// Language model
public function articles()
{
    return $this->belongsToMany(Article::class);
}

// Article model
public function languages()
{
    return $this->belongsToMany(Language::class);
}

// in controller
$articles = Language::find(1)->articles()->wherePivot('title', 'like', '%foo%')->get();
foreach($articles as $article){
    dump($article); // $title = $article->pivot->title
}
0
Ruben Danielyan 25 Фев 2020 в 11:41