2014-07-08 3 views
0

항목 목록 (논문)이 있으며 특정 영역의 모든 논문을 표시하려고합니다. 이제 사용자가 다른 속성에 따라 논문 목록을 필터링 할 수 있기를 바랍니다. Laravel 조인 및 매개 변수가있는 간략한 쿼리

내가 웅변 관련 유지하기 위해 노력하고있어

Papers   
    id 
    name 
    author_id 
    year 
    paperQuality 
    userRating 

Authors   
    id 
    name 
    birthDate 

Paper_areas  
    id 
    paper_id 
    area_id 
    significance 

Area    
    id 
    name 
    creationYear 

테이블/모델입니다. 사용자는이 내가 지금 2011 년의 논문만을 지금

$paper_areas_query = Paper_areas::join('areas', function($join){ 
    $join->on('areas.id', '=', 'paper_areas.area_id') 
    ->where('areas.creationYear', '=', 2011); 
}); 

$paper_areas_query->join('papers', function($join){ 
    $join->on('papers.id', '=', 'paper_areas.paper_id') 
    ->where('papers.year', '=', 2011) 
    ->where('papers.paperQuality', '=', 4) 
    ->where('papers.userRating', '=', 5); 
}); 

$paper_areas_query->join('authors', function($join){ 
    $join->on('authors.id', '=', 'papers.author_id'); 
}); 

$paper_areas_query->select('paper_areas.id', 'paper_areas.paper_id', 'paper_areas.area_id'); 
$paper_areas_query->orderBy('authors.name','asc'); 
$paper_areas_query->orderBy('papers.title','asc'); 
$paper_areas_query->groupBy('papers.id'); 

에 의해이 무엇

, area.creationYear

papers.year, papers.paperQuality, papers.Rating, paper_areas_significance 후 필터링 할 수 있어야한다 표시되지만 2 가지 문제가 있습니다.

  1. url에서 가져온 매개 변수를 사용하여 연 반복 할 수 있습니까?

  2. 어떻게 내가 Paper_areas 컬렉션을 가지고있는 방식으로 결과 집합을 필터링 할 수 있습니까? 위의 코드를 살펴보면 다른 코드처럼 "좋지 않은"것처럼 보입니다.

+0

Paper_areas 테이블의 'topic_id' 열이'Areas' 테이블의 키입니까? –

+0

예, 죄송합니다 - 이름을 변경했습니다 – simon

답변

0

데이터를받는 방법을 개인적으로 수정하고 대신 모델 자체 내에 도우미 함수를 만듭니다. 이처럼 종이 모델에서

, 고려 뭔가 :

public function fromYear($year) 
{ 
    return $this->where('year', '=', $year); 
} 

public function author() 
{ 
    return $this->belongsTo('Author'); 
} 

그리고 당신의 Areas 모델은 :

public function papers() 
{ 
    return $this->belongsToMany('Paper', 'Paper_areas', 'id', 'topic_id'); 
} 

그런 다음, 주어진 Area 예, 당신은에 대한 저자의 모두를 얻을 수 있습니다 특정 연도에 해당 지역의 모든 논문 :

$id = 1; 
$area = Area::find($id); 
$papers = $area->papers->fromYear(2011)->get(); 
foreach($papers as $paper) { 
    $author = $paper->author; 
    // ... 
} 

지금까지 URL 매개 변수에서 올해지고, 당신은 당신의 경로에이 같은 작업을 수행 할 수 있습니다이 같은

Route::get('/my-route/{year}', '[email protected]'); 

그리고 뭔가를 컨트롤러에서 :

class MyController 
{ 
    public function action($year) 
    { 
     $area = /** get area instance **/; 
     $papers = $area->papers->fromYear($year)->get(); 
    } 
} 

을 그 후, 경로 /my-route/2014 타격 위의 action 메서드에 문자열 2014를 전달합니다. 다른 모든 필터링 요구 사항에 대해 기본적으로 동일한 작업을 수행 할 수 있어야합니다.

+0

아이디어를 주셔서 감사합니다, 나는 이것을 염두에 두어야합니다. 그러나 "문제"는 사용자가 paper_areas.significance를 필터링 할 수 있어야한다는 것입니다. 이 쿼리에서 이와 같은 작업을 수행 할 수있는 가능성은 없습니다. 변수 $ papers는 논문 모음입니다. 이 속성을 액세스 할 수 없기 때문에 belongsToMany를 사용하면이 중요성에 도달 할 가능성이없는 것으로 보입니다. – simon

관련 문제