2014-11-03 4 views
0

제목은 오해의 소지가 있지만 여기에 문제가 있습니다. 레시피 모델과 테마 주간 모델 (오렌지 조리법 주간, 비건 채식 주간 등)이 있습니다. 이제는 매일 한 조리법을 연관시켜야합니다. 내가 원하는 것은 Week::find(1)->mondayLaravel Eloquent에서 명명 된 관계

주당 모델 (monday, tuesday 등)에 7 개의 관계 (하루에 하나씩)를 작성하여 작성했지만 장황하게 들릴 것이라고 생각했습니다. 또 다른 방법은 피벗 테이블에 하루를 추가하는 다 대다 관계를 만드는 것이지만 그때 나는 "채식 주간 월요일의 조리법"에 직접 액세스 할 수 있다고 생각하지 않았습니다.

당신은 어떻게 생각하십니까? 누구든지 이것을 성취 할 수있는 더 좋은 방법을 알고 있습니까?

+1

쿼리를 실행하는 것처럼 "-> 월요일"을 사용 하시겠습니까? 잘. Scope (http://laravel.com/docs/4.2/eloquent#query-scopes)를 사용할 수 있다고 생각합니다. 다른 문제들에 관해서는 ... 지금 당장은 도움이 안됩니다. – klauskpm

+0

글쎄요, 스코프는 좋은 지적이지만, 제가 정확히 찾고있는 것은 아닙니다. "-> 월간"은 내가 조리법에 접근 할 필요가있는 방식의 예입니다. 그러나 실제 문제를 명확히하는 것이 더 좋습니다. : 나는 일주일 조리법을 열심히 읽는 등 조리법 전체를로드합니다. 나는 또한 7 번을 질의하지 않고 하루를 기준으로 각각을 검색하는 논리적 인 방법을 처분하고자한다. – lucabartoli

+0

조리법을 평일과 어떻게 일치 시킬지에 대해서는 아무 것도 말하지 않습니다. 관련 레시피 컬렉션에서 주어진 레서피를 가져올 몇 가지 방법이 아니라 여기에 필요한 범위가 아닙니다. 이는 전적으로 사용자에게 달려 있습니다. –

답변

0

당신이 조리법은 과거의 어떤에서 하루에 속하는 것이다 레시피 테이블 등의 평일 저장하는 경우 시간을 - 당신은이처럼 Week 모델의 관계와 방법을 만들 수 있습니다

public function recipes() 
{ 
    return $this->hasMany('Recipe'); 
} 

public function recipesForDay($day) 
{ 
    return $this->recipes()->where('day',$d); 
} 

... 다음은, 그러나, 당신의 Recipe 표는 어떤 관계 정보를 저장하지 않는 경우 (Week::find(1)->recipesForDay('monday')->first();


를 호출하여 매일 액세스 즉, 더 week_idday 없다 열이 recipes 인 경우 중간 recipe_week 피벗 테이블이 필요합니다. 피벗 테이블과 같아야합니다

recipe_week 
------------------------------------ 
recipe_id (integer/unsigned) 
week_id (integer/unsigned) 
day  (integer, enum, or string) 

당신의 Week 모델에서 (Week.php) :

public function recipes() 
{ 
    return $this->belongsToMany('Recipe')->withPivot('day'); 
} 

public function recipesByDay() 
{ 
    return $this->recipes->keyBy('pivot.day'); 
} 

public function recipeForDay($day) 
{ 
    return $this->recipes()->where('day', $day)->first(); 
} 

선택적으로, 당신의 Recipe 모델 (Recipe.php) :

public function weeks() 
{ 
    return $this->belongsToMany('Week')->withPivot('day'); 
} 

이 설정을 사용하면 attach을 사용하여 조리법과 주간을 구분하여 추가 속성으로 날짜를 지정합니다. 예를 들어, 주 # 1 월요일 조리법으로 조리법 # 9를 지정합니다 : 당신의 recipes 표는 그대로 유지하면서, 관계를 만들어

Week::find(1)->recipes()->attach(9, array('day' => 'monday')); 

을 .... 그들을 루프없이

$recipe = Week::find(1)->recipeforDay('wednesday'); 

가 특정 주에 대한 모든 조리법을 얻으려면, 그들의 하루에 액세스 :

그런 다음, 특정 일에 대한 조리법을 얻기 위해, 당신은 조회 할 수 있습니다

$recipes = Week::find(1)->recipesByDay(); 
var_dump($recipes['monday']->name); 
var_dump($recipes['monday']->ingredients); 
// etc... 
+0

레서피 모델을 수정하고 싶지 않습니다. 어쨌든 나는 당신의 접근법을 이해하고, 레서피 테이블을 건드리지 않도록 수정할 수 있습니다. 그러나 한 가지 점이 있습니다. 어떻게 일주일 내내 열심히로드 할 수 있습니까? 나는 이것이 전체 주 조리법을 얻는 데 7 + 1 개의 질의가 필요할 것이라고 생각한다. – lucabartoli

+0

이 접근법은'week_id'가'Week'에 연결된 외래 키인'Recipe' 모델에'week_id'와'day'를 저장한다고 가정합니다. 이 경우,'Week :: with ('recipes') -> find (1) -> get();'에 의해 전체 주를로드 할 수 있습니다. 그러나 관계 정보가 'Recipe' 테이블에 저장되어 있지 않다면 두 피연산자를 연결하기 위해 중간 피벗 테이블이 필요합니다. 해당 피벗 테이블에는 추가 'day'열이 포함됩니다. – damiani

+0

예, 피봇 테이블이 내가 고려한 첫 번째 접근 방식이었습니다. 또한 전체 주간의 모든 요리법을 열렬하게로드 할 수 있습니다. '$ recipe-> pivot-> day' 컬렉션의 단일 레서피에서 그날에 접근 할 수 있지만, 전체 컬렉션을 순환시키지 않고서도 하루를 통해 직접 레서피를 검색 할 수 있는지는 알 수 없습니다 (예 : 인덱스 배열). – lucabartoli