2016-07-22 7 views
1

私は、別のテーブルの他のデータと一致させるために必要なデータを取り消すソリューションを探しています。次に、このデータを表の形でブレード内に表示したいと考えています。2つの異なるデータベーステーブルのデータを照合して表示する方法

データベース内には、マッチングに使用するユーザーの資格情報(たとえば、製品の希望価格)を格納する「一致」エンティティがあります。エンティティには、「マッチング」がウェブサイトのユーザに属するため、「peopleID」が含まれています。ユーザーが作成されると、その「一致する」エンティティ内に格納されている一致オプションが割り当てられます。一致エンティティ内の行数は、ユーザー作成段階で選択された郡の数によって異なります。

データベースから一致するデータを取り出すには、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(); 

だから私は別の「郡」の2つのマッチングを持つ顧客の一つのために。最後に追加されたデータのみが表示されます。別の郡を含む他の照合用のデータを表示するにはどうすればよいですか。私が何を意味するのか知っていれば幸いです

ありがとうございました。

更新 - コードの大部分が完了しました。ご協力ありがとうございました。

2番目の質問は、残りの一致オプションを追加することです。前述のように、マッチの数は追加された郡の数によって異なります。それぞれのマッチには独自の属性があります。アイデアは、各郡の一致した結果を表示することです。

これを行うには、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'); 
} 

私はマッチの人の "検索" の資格情報を保持しているとして、それらの間の接続を持っています。あなたが提供した最初のソリューションは完全に機能します。現在、このソリューションは郡ごとの売上を除外しました。これは、最低価格と上限価格(minprice、maxprice)とbrand_aとbrand_bなどのその他の資格情報でフィルタリングする必要があるため、良い動きです。

brand_aとbrand_bの考え方: チェックボックスは、Matching内のbrand_aとbrand_bの値を変更する責任があります。これらがチェックされている場合、マッチングエンティティ内の値は「1」になります。これらがチェックされていない場合、それらは「0」になります。つまり、売上はそれらの値によって除外される必要はありません。

販売エンティティには「ホールディングス」属性が含まれています。 「ホールディングス」の価値は、brand_aまたはbrand_bとすることができます。販売には「価格」も含まれています。だから、

、これを明確にする:

販売エンティティが含まれていますSaleID、価格、ホールディングス、郡を。

ホールディングスは、brand_aまたはbrand_bの値です。 価格は単なる数値です。 郡は平文です。

マッチングエンティティには、PeopleID、MinimumPrice、MaximumPrice、brand_a、brand_b、countyが含まれます。

PeopleIDは外部キーです。どのマッチングがどのユーザに属するのかを知る必要があります。 (選択された郡の数に応じて、1人のユーザーに複数の一致が存在する可能性があります)。 MinimumPriceとMaximumPriceは数字です。 brand_aとbrand_bは、チェックボックスがオンになっているかどうかに応じた値(1または0)です。 郡は郡の名前です。

人1543(peopleID = 1543)に3つのマッチが含まれ、それぞれに異なる検索資格情報が含まれているようになりました。

第一: PeopleID:1543 MinimumPrice:1000 MaximumPrice:7000 brand_a:0 brand_b:1 郡:county_a

第二: PeopleID:1543 MinimumPrice:2500 MaximumPrice:10000 brand_a :1 brand_b:1 郡:county_f

3番目: PeopleID:1543 MiniumPrice:2000 MaximumPrice:9500 brand_a:0 brand_b:0 郡:私は販売の内部にあるデータに対してこのデータを一致させる必要がある

をcounty_d。価格が異なるなど、1,000以上の異なる売上がある可能性があります。私はそれらをフィルタリングし、人のマッチングに基づいて人が望むSalesを表示するだけです。

私はこれがあなたに状況をより良く願っています。ありがとう。

+0

雄弁にするか、またはDBファサードで? – C2486

+0

@Rishiこのシナリオでうまくいくものは何でも。ありがとう。 –

+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」であることが問題となっていると呼ばれるものは言及しませんでした。

ユーザー クラスのユーザーが雄弁を拡張{

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(); 

AこのissへのよりよいアプローチUE(と思う)、その後MatchはあなたがMatchCountySalesをリンクアップできるかどうcounty_id、あなたは関係を通じては多くを持って使用することができるだろうCountyそれ自身の実体を与えることであろう。あなたがここにドキュメント内を通じて多くを持っていについてもっと読むことができます:https://laravel.com/docs/4.2/eloquent#has-many-through

また、サイドポイントを...あなたのコードのこの部分:

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

はちょうど継続的にあなたのクエリにどこのステートメントを追加します私が想像することは、複数のものがあれば、何も返さないでしょう。

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

、あなたは試合を見ることができるように:ちょうどあなたのループのためのあなたのクエリは、このように終わるでしょうを通じて、この明確に、あなたは2つの郡「county_1」と郡「county_2」を持っている想像作る

できません一度に2つの郡になる!したがって、最初に追加した後におそらく->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

私は自分の質問を更新しました。あなたが私が証明しようとしているアイデアを理解することを願っています。あなたの援助に多くの感謝。 –

関連する問題