2011-12-04 144 views
2

我有兩個表:「汽車」和「代理商」:的foreach在while循環

汽車表

id_car | name_car  | etc. 
----------------------------  
    1 | A3 Sportback | etc. 
    2 | Ranger  | etc. 
    3 | Transit Van |etc. 
    4 | Cayman  | etc. 
etc. | etc.   | etc. 

經銷權表

在deal_cars列我插入作爲陣列的對應車的ID。

deal_id | deal_name | deal_cars | etc. 
-------------------------------------- 
    1  | Ford  | 2,3  | etc. 
    2  | Audi  | 1   | etc. 
    3  | Porsche | 4  | etc. 
etc. | etc.  | etc.  | 

我會得到一個顯示以下信息的頁面:

經銷店的名字 - 汽車

  • 福特 - 遊俠,全順範
  • 奧迪 - A3 Sportback的
  • Cayman - 保時捷

我沒有問題提取經銷商的名稱,但我不知道如何從id中提取汽車名稱。

我嘗試這樣做:

$dealerships_sql = $data->query("SELECT * FROM dealerships ORDER BY deal_name ASC"); 
while($dealerships_obj = $data->extract($dealerships_sql)){ 
    //Dealerships data 
    $deal_id[] = $dealerships_obj->deal_id; 
    $deal_name[] = $dealerships_obj->deal_name; 
    etc etc  

    //Try to get cars ids and turn them in cars names. 
     $deal_cars[] = $dealerships_obj->deal_cars; 
     $deal_cars[] = explode(',',$deal_cars);  
     $cars = array(); 
     foreach ($deal_cars AS $deal_car) { 
      $cars_sql = $data->query("SELECT name_car FROM cars WHERE id_car = '$deal_car'"); 
       while($cars_obj = $data->extract($cars_sql)){ 
       $cars[] = stripslashes($cars_obj->name_car)." ";  
       } 
     } 
} 

我使用Smarty的作爲模板引擎,所以我給你一些增值經銷商:

$smarty->assign ("deal_id", $deal_id); 
$smarty->assign ("deal_name", $deal_name); 
etc etc. 

$smarty->assign ("cars", $cars); 

我的模板是:

<table border="1"> 
<tr> 
<td>Dealership</td> 
<td>Cars</td> 
</tr> 
{section name="foo" loop=$deal_name} 
<tr> 
<td>{$deal_name[foo]}</td> 
<td>{$cars[foo]}</td> 
</tr> 
{/section} 
</table> 

但代碼返回:

  • 福特 - 遊俠
  • 奧迪 - A3掀背
  • 曼 - 保時捷

它僅示出了第一車每個經銷商(第一陣列中發現的元素)。我該如何解決這個問題?

+0

'JOIN'會幫助你。開始[這裏](http://mysqljoin.com/)。 – kapa

+1

你應該閱讀關於規範化。您的'deal_cars'列不符合第一個標準格式。 – halfdan

回答

0

我想你應該爲每個汽車經銷權行(這將讓你得到所有與JOIN,簡單地分析它的所有信息)。

0

最好的辦法是馬上得到一切,你能做到這樣的:

select 
    d.deal_name, 
    group_concat(c.name_car order by c.name_car separator ', ') 
from dealerships d 
join cars c on find_in_set(c.id_car, d.deal_cars) > 0 
group by d.deal_name; 

或(如分開的欄):

select d.deal_id, d.deal_name, c.id_car, c.name_car 
from dealerships d 
join cars c on find_in_set(c.id_car, d.deal_cars) > 0; 
1

我覺得你的數據庫設計不適合在這裏。

汽車表

id_car | name_car  | etc. 
----------------------------  
    1 | A3 Sportback | etc. 
    2 | Ranger  | etc. 
    3 | Transit Van | etc. 
    4 | Cayman  | etc. 
etc. | etc.   | etc. 

經銷商表

deal_id | deal_name | etc. 
--------------------------- 
    1  | Ford  | etc. 
    2  | Audi  | etc. 
    3  | Porsche | etc. 
etc. | etc.  | 

經銷商到汽車表

dealerid | carid 
    1 | 2 
    1 | 3 
    2 | 1 
    etc. | etc. 

作爲你看,我爲這兩張桌子之間的關係做了另一張桌子。

$dealerships_sql = $data->query("SELECT * FROM dealerships ORDER BY deal_name ASC"); 
$dealers = array(); 
while($dealerships_obj = $data->extract($dealerships_sql)){ 
    //Dealerships data, use object 
    $dealerid = $dealerships_obj->deal_id; 
    $dealers[$dealerid]['dealer'] = $dealerships_obj;  

    // Cars 
    $cars = array(); 
    $car_sql = $data->query("SELECT name_car FROM cars JOIN dealerToCars ON carid = id_car JOIN dealer ON deal_id = dealerid WHERE deal_id = " . $dealerid); 
    // now you have all cars from the selected dealer 
    while ($cars_obj = $data->extract($car_sql)) 
    { 
      $cars[] = stripslashes($cars_obj->name_car); 
    } 

    // Assign Cars to dealer 
    $dealers[$dealerid]['cars'] = $cars; 
} 

現在你在$經銷商所有的經銷商與他們的汽車。

由於您使用的是smarty,只需將這個整個數組傳遞給smarty,讓其餘的在模板中做smarty。 Smarty的是能夠使用數組和對象,這樣你就不會需要將其拆分成多個陣列:

$smarty->assign ("dealers", $dealer); 

因爲我不知道你的類,你也許需要添加一些的getter或setter方法或只是讓屬性公開,這樣智者可以訪問它們:

<table border="1"> 
<tr> 
<td>Dealership</td> 
<td>Cars</td> 
</tr> 
{foreach $dealers as $dealer} 
<tr> 
<td>{$dealer['dealer']->deal_name}</td> 
<td>{foreach $dealer['cars'] as $car}{$car}, {/foreach}</td> 
</tr> 
{/foreach} 
</table> 

也許你需要看看有關模板中的標識符。

(我使用的是smarty 3)