Foreach в цикле времени - PullRequest
       19

Foreach в цикле времени

2 голосов
/ 04 декабря 2011

У меня есть две таблицы: «автомобили» и «автосалоны»:

Таблица автомобилей

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

Таблица дилеров

В столбце deal_cars я добавляю идентификаторы соответствующих автомобилей в виде массива.

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

Я получаю страницу, которая отображает следующую информацию:

Название дилера - Автомобили

  • Ford - Ranger, транзитный фургон
  • Audi - A3 Sportback
  • Cayman - Porsche

У меня нетПроблема в том, чтобы извлечь название автосалона, но я не знаю, как извлечь названия автомобилей из идентификаторов.

Я попробовал это:

$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>

Но код возвращается:

  • Ford - Ranger
  • Audi - A3 Sportback
  • Cayman - Porsche

Показываеттолько первый автомобиль (первый элемент найден в массиве) для каждого автосалона.Как я могу решить это?

Ответы [ 3 ]

1 голос
/ 04 декабря 2011

Я думаю, что ваш дизайн базы данных здесь не подходит.

Таблица автомобилей

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

Поскольку я не знаю ваших классов, вам, возможно, потребуется добавить несколько методов получения или установки илипросто сделайте свойства общедоступными, чтобы smarty мог получить к ним доступ:

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

0 голосов
/ 04 декабря 2011

Лучшим способом было бы получить все сразу, вы можете сделать это так:

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;
0 голосов
/ 04 декабря 2011

Я думаю, у вас должен быть ряд дилеров для каждого автомобиля (который позволит вам получить всю информацию с помощью JOIN и легко ее проанализировать).

...