2011-12-04 42 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)