У меня есть таблицы базы данных, структурированные следующим образом (это что-то вроде трудов международных конференций):
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?
я бы хотел избежать решений, требующих модификации базы данных.