2016-07-22 6 views
1

다른 테이블의 다른 데이터와 일치시키는 데 필요한 필수 데이터를 철회하는 솔루션을 찾고 있습니다. 그런 다음이 데이터를 테이블 형태로 블레이드 안에 표시하려고합니다.두 개의 서로 다른 데이터베이스 테이블의 데이터를 일치시켜 표시하는 방법

데이터베이스 내부에는 일치시키기 위해 사용하려는 사용자의 자격 증명 (예 : 원하는 제품 가격)을 저장하는 "일치하는"엔터티가 있습니다. 엔터티는 "일치"가 웹 사이트 사용자에게 속한 것처럼 "peopleID"를 포함합니다. 사용자가 생성되면 해당 "일치하는"엔티티에 저장되는 일치하는 옵션을 지정합니다. Matching 엔티티의 행 수는 사용자 생성 단계에서 선택한 카운티 수에 따라 다릅니다.

데이터베이스에서 일치하는 데이터를 철회하려면 foreach 루프를 사용해야한다는 것을 알고 있습니다.

내가 가지고있는 문제는 블레이드 내부에 데이터를 출력 할 때의 문제입니다. 어떤 이유로 제품은 배열의 마지막 항목과 만 일치합니다. 모든 일치하는 자격 증명으로 prodtucts를 일치시켜야합니다.

코드 :

 $matchings = Match::where('PeopleID', '=', $id)->get(); 
     $sales = DB::table('sales'); 

     foreach ($matchings as $matching) 
     { 
      $county = $matching->county; 
      $sales->where('county', '=', $county); 

     } 

     $results = $sales->get(); 

그래서 고객 중 하나에 내가 다른 "군"두 matchings 있습니다. 마지막으로 추가 된 데이터 만 표시합니다. 다른 카운티를 포함하는 다른 일치 검색에 어떻게 데이터를 표시 할 수 있습니까? 내가 무슨 뜻인지 알기를 바랍니다.

도움 주셔서 감사합니다.

업데이트 - 코드의 주요 부분이 완료되었습니다. 도와 줘서 고마워.

두 번째 질문은 나머지 일치 옵션을 추가하는 것입니다. 앞에서 언급했듯이 일치 횟수는 추가 된 카운티 수에 따라 다릅니다. 각 일치에는 고유 한 속성이 있습니다. 아이디어는 각 카운티마다 일치하는 결과를 보여주는 것입니다.

이렇게하려면 if 문이 필요할 것입니다. 이 코드에

  $maxprice = $match->maxprice; 
      $minprice = $match->minprice; 
      $brand_a = $match->brand_a; 
      $brand_b = $match->brand_b; 

      if($maxprice != '0') 
      { 
       $sales = DB::table('sales')->where('maxprice', '<=', $maxprice); 
      } 

      if($minprice != '0') 
      { 
       $sales = DB::table('sales')->where('minprice', '>=', $minprice); 
      } 

      if($brand_a == '1') 
      { 
       $sales = DB::table('sales')->where('brand_a', '1'); 
      } 

      if($brand_b == '1') 
      { 
       $sales = DB::table('sales')->where('brand_b', '1'); 
      } 

: 당신의 도움에 대한

$user = User::find($id); // get our User with the Id (person id?) 

$matches = $user->matches; // get all the matches 

// or you could one line the above: $matches = User::find($id)->matches; 

// get all the counties in the returned matches, could use pluck() method in higher version of laravel 
$counties = []; 

foreach($matches as $match) { 
    $counties[] = $match->county; 
} 

$results = DB::table('sales')->whereIn('county', $counties)->get(); 

많은 감사

는 여기에 내가 구현하고자하는 예입니다!

@update

관계 :

경기 :

public function people() 
{ 
    return $this->belongsTo('People', 'PeopleID', 'PeopleID'); 
} 

사람들은 매치 사람들의 "검색"자격 증명을 보유

public function matches() 
{ 
    return $this->hasMany('Match', 'PeopleID', 'PeopleID'); 
} 

나는 그 사이의 연결을 가지고있다. 당신이 제공 한 첫 번째 솔루션은 완벽하게 작동합니다. 이제이 솔루션은 카운티별로 매출을 필터링 했으므로 최소 및 최대 가격 (최소 가격, 최대 가격) 및 brand_a 및 brand_b와 같은 기타 자격 증명으로 필터링해야하므로 좋은 조치입니다.

brand_a 및 brand_b의 아이디어 : 체크 박스는 Matching에서 brand_a 및 brand_b 값을 변경해야합니다.이것들을 체크하면 일치하는 엔티티 내의 값이 '1'이됩니다. 확인되지 않은 경우 '0'이되어 판매가 해당 값으로 필터링되지 않아도됩니다.

판매 법인은 "보유"속성을 포함합니다. 'Holdings'의 가치는 brand_a 또는 brand_b 일 수 있습니다. 판매에는 "가격"도 포함됩니다.

그래서,이 명확하게하기 :

판매 법인에는 다음이 포함 SaleID, 가격, 보유, 카운티.

홀딩스는 brand_a 또는 brand_b 값입니다. 가격은 단지 숫자입니다. 카운티는 일반 텍스트입니다.

일치하는 엔터티에는 PeopleID, MinimumPrice, MaximumPrice, brand_a, brand_b, county가 포함됩니다.

PeopleID는 외래 키입니다. 어떤 일치 항목이 어떤 사용자에게 속한 것인지 알 필요가 있습니다. (선택한 카운티 수에 따라 한 명의 사용자에게 여러 개의 일치가있을 수 있음) MinimumPrice 및 MaximumPrice는 숫자입니다. brand_a 및 brand_b는 확인란이 선택되었는지 여부에 따라 값 (1 또는 0)입니다. 카운티는 카운티 이름입니다.

사람 1543 (peopleID = 1543)에 3 개의 일치 항목이 있고 여기에 각각 다른 검색 자격 정보가 포함되어 있습니다.

1 : PeopleID : 1543 MinimumPrice : 1000 MaximumPrice : 7000 brand_a : 0 brand_b : 1 카운티 : county_a

2 : PeopleID : 1543 MinimumPrice : 2500 MaximumPrice : 10000 brand_a : 1 brand_b : 1 카운티 : county_f

세 번째 : 피플 ID : 1543 012 3,516,MiniumPrice : 2000 MaximumPrice : 9500 brand_a : 0 brand_b : 0 카운티 : 나는이 판매 내부에있는 데이터에 대해 데이터를 일치 할 필요

을 county_d. 다른 가격으로 1000 가지가 넘는 판매가있을 수 있습니다. 나는 그들을 필터링하고 사람의 매칭을 기반으로 원하는 판매를 표시해야합니다.

나는이 상황이 당신에게 더 좋기를 바랍니다. 감사.

+0

웅변이나 DB 외관으로? – C2486

+0

@ 리시 시나리오가 더 잘 작동합니다. 감사. –

+0

당신은 4.2를 사용하고 있습니까? – haakym

답변

1

간략히 말하면, Eloquent Relationships을 사용하면 원하는 데이터를 쉽게 검색 할 수 있습니다. 문서의 관계에 대한 자세한 내용은 https://laravel.com/docs/4.2/eloquent#relationships을 참조하십시오.

몇 가지 가정을 했으므로 다음을 실제 설정에 적용해야 할 수 있습니다., 이름이 잘못 될 수 있습니다

User/Person *has many* Match

은 (참고 : 또한, 나는 그것이 매우 어려운 100 %에 질문에서 DB 구조를 이해하지만, 나는 당신의 질문에서 수집 무엇에서 DB 구조는 다음과 같이입니다 발견 하지만 그것이 내가 볼 수있는 모든 단어 난 당신이처럼 관계를 설정해야한다고 생각이에

Match *belongs to* User/Person

을 바탕으로 "사용자"와 "personId을")는 질문에 불리는 것을 언급하지 않았다 :

,210

사용자 클래스 사용자가 설득력을 확장 {

public function matches() 
    { 
     return $this->hasMany('Match'); 
    } 

    //... 
} 

일치 클래스 매치가 설득력을 확장 {

public function user() 
    { 
     return $this->belongsTo('User'); 
    } 

    //... 
} 

그런 다음 코드는 다음과 같을 수 있습니다

$user = User::find($id); // get our User with the Id (person id?) 

$matches = $user->matches; // get all the matches 

// or you could one line the above: $matches = User::find($id)->matches; 

// get all the counties in the returned matches, could use pluck() method in higher version of laravel 
$counties = []; 

foreach($matches as $match) { 
    $counties[] = $match->county; 
} 

$results = DB::table('sales')->whereIn('county', $counties)->get(); 

이 iss에 더 나은 접근 UE (내 생각) 다음 Match 당신이 Match, CountySales를 연결할 수있는 경우가 county_id 다음 관계를 통해 많은을 가지고 사용할 수있을 것 County 그것의 자신의 개체를 제공하는 것입니다. 당신은 에 대한 자세한 여기에 문서의을 통해 많은 것을 가지고 읽을 수 있습니다 또한 https://laravel.com/docs/4.2/eloquent#has-many-through

, 측면 점은 ... 코드의이 부분은 :

$sales->where('county', '=', $county); 

는 지속적으로 추가 할 경우 쿼리에 문 내가 상상할 수있는 것은 하나 이상의 것이 있으면 아무것도 반환하지 않을 것입니다.

그냥이 명확를 만들기 위해, 루프 쿼리는 다음과 같이 끝날 것이다 당신을 통해 당신이 2 개 군 "county_1"및 군 "county_2"를 가지고 상상 :

WHERE COUNTY = "county_1" // first loop 
AND COUNTY = "county_2"  // second loop 

을하면 경기를 볼 수 있습니다 수 없습니다 두 번에 한 번에 카운티! 첫번째 배열이 추가 된 후에 아마도 ->orWhere('county', 'county_value')을 찾고 있었을 것입니다. 그러나 더 나은 접근법은 위의 작업을 완료 한 배열을 전달할 수있는 whereIn('county', $countiesArray)을 사용하는 것입니다.

희망이 도움이됩니다. 그것이 명확하지 않은 경우 알려주십시오.

편집

SaleMatch 엔티티 사이의 관계를 확립하여야 할 가장 좋은 방법. 데이터베이스 스키마를 아직 완전히 이해하지 못해서 어떻게 접근 할 것인지 잘 알 수는 없습니다. 좀 더 자세한 내용을 주면 가능할 수도 있습니다.

또는 쿼리에 조건을 적용하는 데 사용할 배열을 만들어 코드에 접근 할 수 있습니다.4 개의 if 문으로 업데이트 된 질문을 생각해보십시오. 언제든지 반복 할 때마다 더 간단해질 수는 없습니다. 당신의 조건문이 질문의 코드에서 조금 엄격, 당신은 대신 이런 식으로 할

$filters = [ 
    'maxprice' => $match->maxprice, 
    'minprice' => $match->minprice, 
    'brand_a' => $match->brand_a, 
    'brand_b' => $match->brand_b, 
]; 

$salesQuery = DB::table('sales'); 

foreach($filters as $key => $value) { 
    if($value) { 
     $salesQuery->where($key, $value); 
    } 
} 

$results = $salesQuery->get(); 

:

foreach($filters as $key => $value) { 
    if ($value) { 
     if (in_array(['brand_a', 'brand_b'], $key)) { 
      $salesQuery->where($key, $value); 
     } else if($key === 'minprice') { 
      $salesQuery->where($key, '>=' $value); 
     } else if($key === 'maxprice') { 
      $salesQuery->where($key, '<=' $value); 
     } 
    } 
} 

이 방법에 대한 좋은 점은 당신이 쉽게 새로운 조건문을 추가 할 수 있다는 것입니다 매번 새로운 if 문 및 query/where 코드를 작성할 필요없이 필터 배열을 통해

나는 이것이 아마도 최선의 접근 방법이 아니라고 강조 할 것이고 이상적으로는 Eloquent Relationships를 활용할 것이라고 생각하지만, 당장은 그것을 이해할 수없는 경우 출발점이 될 수 있습니다.

+0

귀하의 솔루션은 완벽하게 작동합니다! 시간 내 주셔서 대단히 감사합니다. 마음에 매우 비슷한 해결책이 있었지만 부분을 구현하는 방법을 잘 모르겠습니다. 나는 또 다른 질문이있다. 이것이 중요한 부분이지만 코드에 다른 일치 옵션을 어떻게 추가 할 수 있습니까? 예 : 최소 가격과 최대 가격. –

+0

좋아요! 그게 너에게 효과적이라고 다행이야. 나는 당신이 Eloquent와 관계를 사용하는 것을 읽는 데 약간의 시간을 보낼 수 있기를 바랍니다. 그것은 당신의 시간 가치가 있습니다. 그것이 당신과 밀접한 관련이 있다면 질문을 편집 할 수 있으며, 최선을 다해 답변을 드리겠습니다. 새로운 질문이 다른 경우 언제든지 열 수 있습니다. – haakym

+1

내 질문을 업데이트했습니다. 내가 증명하려고하는 생각을 이해하기를 바랍니다. 많은 도움을 주셔서 감사합니다. –

관련 문제