Как запросить определенные c отношения в Eloquent - PullRequest
0 голосов
/ 04 августа 2020

У меня есть таблицы базы данных, структурированные следующим образом (это что-то вроде трудов международных конференций):

languages (id, abbr)

papers (id, title, fulltext, language_id)

keywords (id)
keyword_translations (id, label, keyword_id, language_id) // cointains language-specific tranlation of given keyword
paper_keywords (id, paper_id, keyword_id) //M:N relation between papers and keywords

usage (id)
usage_translations (id, label, usage_id, language_id)
paper_usage (id, paper_id, usage_id) //M:N relation between papers and usages

Здесь описаны статьи и их метаданные. Желаемый пользовательский интерфейс должен быть на нескольких языках, поэтому существуют «таблицы перевода».

В моих моделях Eloquent я построил все простые отношения M: N belonsToMany вроде «все документы с этим оборудованием». Модели выглядят так:

class Paper extends Model
{
    public function keywords()
    {
        return $this->belongsToMany('App\Keyword', 'paper_keyword');
    }

    public function usages()
    {
        return $this->belongsToMany('App\Usage', 'paper_usage');
    }
}
class Keyword extends Model
{
    public function translations()
    {
        return $this->hasMany('App\KeywordTranslation');
    }

    public function papers()
    {
        return $this->belongsToMany('App\Paper', 'paper_keyword');
    }
}

… и то же самое для использования.

Теперь мне нужно запросить конкретную c бумагу, заданную ее идентификатором (или, возможно, несколькими paper) и все связанные с ним ключевые слова и использование, но только с заданным language_id. (Этот language_id касается только переводов (для пользовательского интерфейса), у документа может быть другой language_id. Типичный пример: я хочу увидеть статью на словацком языке или Poli sh, но пользовательский интерфейс находится на чешском языке, поэтому должны быть чешские метки для ключевых слов и других метаданных).

Я знаю, что могу App\Paper::with(['usages.translations', 'keywords.translations'])->find(1605);, но это принесет все переводы, а не только язык c. В простом SQL я бы просто объединил все таблицы, используя некоторые псевдонимы и запрос WHERE keyword_translations.language_id = 1, но в Eloquent?

я бы хотел избежать решений, требующих модификации базы данных.

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Думаю, вам нужен запрос ниже

$languageId = 'language_id';

$papers = App\Paper::with(['usages.translations', 'keywords.translations'])
        ->whereHas('usages.translations', function($query) use ($languageId) {
            $query->where('language_id', $languageId);
        })
        ->whereHas('keywords.translations', function($query) use ($languageId) {
            $query->where('language_id', $languageId);
        })
        ->get();
0 голосов
/ 04 августа 2020

Похоже, что вам нужен вложенный запрос:

App\Paper::with(['usages.translations', 'keywords.translations'])
            ->where('usages.translations.language_id', 'your_id_goes_here')
            ->orWhere('keywords.translations.language_id', 'your_id_goes_here')
            ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...