Yii сводные таблицы

May 21, 2015

Немного изврата. Кто может посоветовать что лучше- пишите в комментариях или в личку.Предположим есть база



нас интересует такой вопрос - как связать данные из нескольких таблиц (да даже без модели) в одну.

возьмем самый простой пример.

analiz_create - таблица анализов. одному анализу соответсвует несколько элементов.
analiz_data - хранит данные

чтобы ввести в analiz_data данные, нужно знать какие столбцы соответствуют определенному анализу.

    $connection = Yii::app()->db;
$sql = "
SELECT t2.id AS id_elem,
t2.name,
t3.name AS TYPE,
t2.f_filter,
t2.name_pk,
t2.name_value,
t2.comment
FROM a_template_has_elem t1,
a_element t2,
a_elem_type t3
WHERE template_id =$id_template
AND t1.elem_id = t2.id
AND t2.type_id=t3.id
order by f_order;
";
$dataReader = $connection->createCommand($sql)->query();
$rows = $dataReader->readAll();
for($i = 0, $cnt = count($rows); $i < $cnt; $i++)
{
$id = $rows[$i]['id_elem'];
$typeel = $rows[$i]['type'];

                echo '
';
echo CHtml::label($rows[$i]['name'], $rows[$i]['name']);
echo CHtml::textField("elem[$id][val][]", '', array('id' => $rows[$i]['name']));
echo '
';

здесь я из таблицы a_template_has_elem получаю список полей и отображаю их.
в контролере тогда

                if (isset($_POST['elem']))
{
$command = Yii::app()->db->createCommand();
$max = Yii::app()->db->createCommand()
->select('max(id) as max')
->from('a_analiz_create')
->queryScalar();

$Ids = $_POST['elem'];
$cnt = max(array_keys($Ids));
$min = min(array_keys($Ids));
for($i = $min; $i <= $cnt; $i++)
{
$type = $Ids[$i]['type'][0];
$val = $Ids[$i]['val'][0];
if ($type == 'float')
{
(real)$val = str_replace(',','.',$val);
}
else if ($type == 'int')
{
$val = (int)$val;
}
if (isset($val) && !empty($val))
$command->insert('a_analiz_data', array(
'analiz_id' => $max,
'value' => $val,
'elem_id' => $i,
'user_id' => Yii::app()->user->id,
));
}
};


то вставляем данные при помощи sql запроса, не пользуясь стандартными средствами.

 


Source: des1roer.blogspot.com

Комментарии

comments powered by Disqus