2014-11-30 3 views
0

фонLaravel Красноречивый не может получить простой hasMany отношение рабочего

У меня есть интернациональное DB, которая хранит свои строки для различных языков, как это:

products 
    id 
    price 

product_translation 
    id 
    product_id 
    language_id 
    name 
    description 

languages 
    id 
    name (e.g. 'English', 'German') 
    code (e.g. 'en', 'de') 

С соответствующими моделями для каждой таблицы (PRODUCT , ProductTranslation, Language). В моих взглядов я хочу принести список продуктов, как это:

// get first 20 products, list name and price. 
@foreach(Product::take(20)->get() as $product) 
{{$product->translations->name}} {{$product->price}} 
@endforeach 

Проблема

Мое приложение будет возвращать имена продукта в соответствии с тем, что текущий App::getLocale() установлен в положение (т.е. en и de).

Я только начинаю с Larvel's Eloquent, я не уверен, как указать правильные отношения (или если я действительно делаю это правильно вообще).

Моя попытка

Я определили OneToMany отношения между ними Product и ProductTranslation:

class Product extends \Eloquent { 

    protected $with = ['translations']; 

    public function translations() 
    { 
     return $this->hasMany('ProductTranslation'); 
    } 
} 

Это прекрасно работает, но будет возвращать все переводы (мы хотим только текущей локали).

Я тогда указать OneToOne отношения между ProductTranslation и Language:

class ProductTranslation extends \Eloquent { 

    protected $with = ['language']; 

    public function language() 
    { 
     return $this->hasOne('Language') 
     ->where('code', App::getLocale()); 
    } 
} 

Я знаю, это не работает, и я озадачен на то, что делать дальше. У кого-нибудь есть более чистый подход?

ответ

0
class ProductTranslation extends \Eloquent { 

    protected $with = ['language']; 

    public function language() 
    { 
     return $this->hasOne('Language'); 
    } 
} 

В маршрут или контроллер

ProductTranslation::language()->where('code', '=', App::getLocale())->get(); 

Чтобы сохранить это в модели делают этот

public static function getLocale() 
{ 
    return static::language()->where('code', '=', App::getLocale())->get();; 
} 

вызвать функцию с помощью ProductTranslation::getLocale()

+0

Как я уже сказал @boubbin, можно ли держать его внутри модели? его намного чище. –

+0

@VeraWang Да, посмотрите мой код – Rafael

0

Laravel имеет встроенную систему для переводов и с небольшой работой вы можете заставить его работать с базой данных, однако это, вероятно, не то, для чего он предназначен.

Вы не можете получить те, которые вы хотите вызвать, отношения основаны на идентификаторах (внешних ключах), а не на строковых ограничениях или аналогичных.

На ваш взгляд вы можете посмотреть в отфильтровывать те, которые не являются для кода языка вы хотели с помощью фильтра(): http://laravel.com/docs/4.2/eloquent#collections

Или Вы могли бы рассмотреть вопрос о переходе на переводы в нужное место, как жестко закодированной: http://laravel.com/docs/4.2/localization, и если это невозможно, вы можете изучить выборку из базы данных, используя метод, описанный этой ссылкой.В конце концов он просто возвращает массив переводов, и все равно, как вы построили массив, жестко закодированный или из базы данных.

+0

Можно ли сохранить все внутри функции отношений модели? –

Смежные вопросы