2014-11-30 2 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') 

(제품을 , ProductTranslation, Language). 내보기에 나는이 같은 제품 목록을 가져 오기하려면 :

내 앱이 현재 App::getLocale()가 (즉 ende)로 설정 내용에 따라 제품의 이름을 반환합니다

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

문제.

저는 Laravel의 Eloquent로 시작 했으므로 정확한 관계를 지정하는 방법이 확실하지 않습니다. (또는 실제로 올바르게 수행하고있는 경우).

내가 Product 사이 ProductTranslation에서 OneToMany 관계 지정한

내 시도 : 이것은 잘 작동

class Product extends \Eloquent { 

    protected $with = ['translations']; 

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

을하지만, 모든 번역을 반환합니다 (우리는 현재 로케일을 원하는).

나는 다음 ProductTranslationLanguage 사이 OneToOne 관계 지정

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

이 모든 내부 모델 관계 함수를 유지할 수 있습니까? –

관련 문제