2016-07-22 159 views
1

我正在尋找一種解決方案,該解決方案將撤回用於匹配來自不同表格的其他數據的基本數據。然後我想以表格的形式在刀片中顯示這些數據。如何匹配來自兩個不同數據庫表的數據並將其顯示

在數據庫中,我有一個「匹配」實體,存儲用戶的憑證,我想用它來匹配(例如產品的期望價格)。實體包含「peopleID」作爲「匹配」屬於網站用戶。當用戶被創建時,我們分配匹配選項,這些選項被存儲在該「匹配」實體內。匹配實體內部的行數取決於在用戶創建階段選擇的縣的數量。

我知道要從數據庫中提取匹配數據我需要使用foreach循環。

我的問題是當我在刀片內輸出數據。出於某種原因,它僅將產品與數組中的最後一項匹配。它應該將產品與所有匹配的憑證相匹配。

代碼:

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

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

     } 

     $results = $sales->get(); 

所以對於客戶之一,我有兩個匹配數不同的「縣」。它只顯示添加的最後一個數據。我怎麼能讓它顯示其他匹配的數據,其中包含不同的縣。我希望你明白我的意思。

感謝您的任何幫助。

更新 - 大部分代碼已完成。感謝您的幫助。

第二個問題是關於添加其餘的匹配選項。如前所述,比賽的數量取決於所添加的縣的數量。每場比賽都有自己的屬性。這個想法是顯示每個縣的匹配結果。

我知道我需要一些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',這意味着銷售不必被這些值過濾掉。

銷售實體包含「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個匹配項,每個匹配項都包含不同的搜索憑證。

第一: 的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:county_f

3rd: PeopleID:1543 MiniumPrice:2000 MaximumPrice:9500 brand_a:0 brand_b:0 縣:county_d

我需要這個數據針對的是銷售中的數據相匹配。可以有超過1000種不同的價格等不同的銷售額。我只需要對它們進行過濾並根據個人的匹配顯示人員所需的銷售額。

我希望這能更好地呈現你的情況。謝謝。

+0

通過雄辯或數據庫門面? – C2486

+0

@Rishi無論什麼情況下都能更好地工作。謝謝。 –

+0

您使用4.2嗎? – haakym

回答

1

總之,我相信你需要利用雄辯關係輕鬆檢索你想要的數據。請閱讀文檔中的關係:https://laravel.com/docs/4.2/eloquent#relationships

我做了一些假設,以便您可能需要在實際設置中使用以下內容。另外,我覺得這是很困難的100%的瞭解您的數據庫結構從你的問題,但是從我從你的問題收集你的數據庫結構是這樣的:

User/Person *has many* Match

(注:產品名稱可能是錯誤的,但你沒有提到它叫什麼的問題,我能看到的是單詞「用戶」和「PERSONID」)在此基礎上,我認爲你應該建立這樣的關係

Match *belongs to* User/Person

用戶 類用戶擴展雄辯{

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

一更好的方法來這個問題UE(我認爲)將是給County它自己的實體,然後Match將有一個county_id那麼你可以使用一個有許多通過關係,如果你能連接起來MatchCountySales。你可以閱讀更多關於有許多經過這裏的文檔https://laravel.com/docs/4.2/eloquent#has-many-through

此外,麪點......你的這部分代碼:

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

只會不斷補充,語句來查詢如果不止一個,我會想象它不會返回任何東西。

只是爲了更清楚,想象你有2個縣「county_1」,縣「county_2」,通過你的for循環您的查詢最終會是這樣的:

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

,正如你所看到的比賽不能一次兩個縣!所以你可能在第一次添加後尋找->orWhere('county', 'county_value'),但更好的方法是使用whereIn('county', $countiesArray),你可以傳遞你建立的數組,這正是我上面所做的。

希望這會有所幫助!如果不清楚,請告訴我。

編輯

最好的辦法是建立SaleMatch實體之間的關係。由於我還沒有完全理解你的數據庫模式,所以我不能很好地告訴你如何解決這個問題。如果你提供了一些更多的細節,這可能是可能的。

或者,您可以通過構建一個數組來處理代碼,以便將條件應用於查詢。考慮你的四條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); 
     } 
    } 
} 

對這種做法的好處是,你可以輕鬆地添加新的條件語句通過filters數組無需每次都寫一個新的if語句和query/where代碼。

我會強調這可能不是最好的方法,理想情況下你會利用雄辯關係,但它可能是一個起點,如果你不能馬上解決這個問題。

+0

您的解決方案完美無缺!非常感謝您的寶貴時間。我有非常類似的解決方案,但我不知道如何實現一些部分。我有另一個問題。這是完成的主要部分,但我怎麼能添加其他匹配選項的代碼 - 例如最低和最高價格。 –

+0

太棒了!我很高興它爲你工作。我希望你可以花一些時間閱讀使用雄辯和人際關係,這將是非常值得的。如果它與您的問題密切相關,您可以編輯您的問題,我會盡我所能來回答。如果情況完全不同,你總是可以開一個新的問題。 – haakym

+1

我已更新我的問題。我希望你能理解我想證明的想法。非常感謝你的協助。 –

相關問題