|
Cake-PHP.ru Форум программистов CakePHP (на сайт)
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
atas Гость цитировать
|
Добавлено: 02 Июн 2008 01:07:10 Заголовок сообщения: cakePHP relational mapping problem |
|
|
Здравствуйте!
У меня проблема с relational mapping в cakePHP например для Invoice модели описываю отношение один к многим с InvoiceItem, BackOrder и WorkOrder
Код: |
var $hasMany = array ('InvoiceItem' => array(
'className' => 'InvoiceItem',
'conditions'=>'',
'order'=>'',
'foreignKey'=>'invoice_id'
),
'BackOrder' => array(
'className' => 'BackOrder',
'conditions'=>'',
'order'=>'',
'foreignKey'=>'invoice_id'
),
'WorkOrder' => array(
'className' => 'WorkOrder',
'conditions'=>'',
'order'=>'',
'foreignKey'=>'invoice_id'
)
);
|
Соответственно в моделях InvoiceItem, BackOrder и WorkOrder (в каждой из них) записываю:
Код: |
var $belongsTo = array(
'Invoice' => array(
'className' => 'Invoice',
'foreignKey' => 'invoice_id'
)
);
|
С InvoiceItem все работает хорошо, а с BackOrder и WorkOrder не отображаются даже данные.
Пишет:
Код: |
Warning: Invalid argument supplied for foreach() in C:\Apache2\Apache2\htdocs\kawartha\dcm\app\views\back_orders\index.thtm
|
Как толко коментирую BackOrder и WorkOrder в $hasMany и var $belongsTo в соответствуюших моделях. То данные отображаются.
Как настроит связку один ко многим во всех трех моделях?
Спасибо. |
|
Вернуться к началу |
|
|
Алесь
цитировать
Зарегистрирован: 22 Ноя 2007 19:23:20 Сообщения: 29 Откуда: Минск
|
Добавлено: 02 Июн 2008 13:36:56 Заголовок сообщения: |
|
|
Попробуй так:
Код: |
var $belongsTo = array(
'Invoice' => array(
'className' => 'Invoice',
'foreignKey' => 'id'
)
);
|
|
|
Вернуться к началу |
|
|
atas Гость цитировать
|
Добавлено: 02 Июн 2008 16:18:22 Заголовок сообщения: |
|
|
to Алесь spasibo!!
Probival, ne pomoglo. Voobshe to, mne kazhetsja, nado 'foreignKey' => 'invoice_id', no vozmozhno ja i oshibajus.
Budut drugie predlozhenija?
Spasibo |
|
Вернуться к началу |
|
|
Алесь
цитировать
Зарегистрирован: 22 Ноя 2007 19:23:20 Сообщения: 29 Откуда: Минск
|
Добавлено: 02 Июн 2008 16:28:35 Заголовок сообщения: |
|
|
А тебе точно подходит $hasMany? Может тебе нужно $HBTM? |
|
Вернуться к началу |
|
|
Hellbot
цитировать
Зарегистрирован: 19 Май 2008 16:29:15 Сообщения: 34
|
Добавлено: 02 Июн 2008 16:44:34 Заголовок сообщения: |
|
|
А можно код в котором ошибка (указаный файлег) ?
из того что видно, проблема в
Цитата: | C:\Apache2\Apache2\htdocs\kawartha\dcm\app\views\back_orders\index.thtm |
А не в связях вовсе. |
|
Вернуться к началу |
|
|
atas Гость цитировать
|
Добавлено: 02 Июн 2008 16:46:50 Заголовок сообщения: |
|
|
to Алесь
Цитата: | А тебе точно подходит $hasMany? Может тебе нужно $HBTM?
|
Vozmozhno, ja ne ochen to silen v ORM, esli s $HBTM kak budet viglajadit dlja moego sluchaja?
spasibo |
|
Вернуться к началу |
|
|
atas Гость цитировать
|
Добавлено: 02 Июн 2008 16:54:25 Заголовок сообщения: |
|
|
to Hellbot
Код: |
<h2>Back Orders</h2>
<?php echo $html->link("Add back Order", "/back_orders/add"); ?>
<br>
<?php echo $html->link("Advanced search", "/back_orders/adv_search"); ?>
<br><br>
<table cellpadding="0" cellspacing="0" id="grid">
<tr bgcolor = "Gray">
<th>Id</th>
<th>Route Code</th>
<th>SKU</th>
<th>Product Description</th>
<th>Quantity</th>
<th> </th>
</tr>
<?php foreach ($back_orders as $back_order): ?>
<tr>
<td><?php echo $back_order['BackOrder']['id']; ?></td>
<td>
<?php echo $back_order['BackOrder']['route_code']; ?>
</td>
<td>
<?php
echo $productsSKU_key_value[$back_order['BackOrder']['product_id']];
?>
</td>
<td>
<?php
echo $products_key_value[$back_order['BackOrder']['product_id']];
?>
</td>
<td>
<?php echo $back_order['BackOrder']['back_order_quantity']; ?>
</td>
<td>
<?php echo $html->link(
$html->image('../../kawartha/dcm/app/webroot/img/edit.gif'),
"/back_orders/edit/{$back_order['BackOrder']['id']}", null, null, false)?>
<?php echo $html->link(
$html->image('../../kawartha/dcm/app/webroot/img/delete.gif'),
"/back_orders/delete/{$back_order['BackOrder']['id']}",
null,
'Are you sure?', false
)?>
<?php echo $html->link(
$html->image('../../kawartha/dcm/app/webroot/img/release.gif'),
"/back_orders/release_b_o/{$back_order['BackOrder']['id']}/{$back_order['BackOrder']['product_id']}/" . $back_order['BackOrder']['back_order_quantity'] . '/' . $page, null, null, false)?>
</td>
</tr>
<?php endforeach; ?>
</table>
<?php
echo "<p>" . $paging_line . "</p>";
?>
|
v sluchae nepravilnogo mappinga v massive $back_orders nichego net, poetomu i vipodaet oshibka. Problema ne v dobavlenii
Код: |
if ($back_orders)
{
ta ta ta
}
|
i oshibki ne budet vidno
a kak sdelat pravilno mapping? |
|
Вернуться к началу |
|
|
atas Гость цитировать
|
Добавлено: 02 Июн 2008 16:57:19 Заголовок сообщения: |
|
|
K state u menja cakePHP 1.1 na versiju cakePHP 1.2 shas perejti ne mogu po tehnicheskim i moralno-eticheskim prichinam |
|
Вернуться к началу |
|
|
Hellbot
цитировать
Зарегистрирован: 19 Май 2008 16:29:15 Сообщения: 34
|
Добавлено: 02 Июн 2008 16:58:39 Заголовок сообщения: |
|
|
Да в том то все и дело, что маппинг сделан визуально правильно, ничего там такого не работающего нету.
обратный мапинг от BackOffers к Invoice вообще не имеет значения в данном случае.
Тогда если можно, код контроллера для данного action и запросы SQL которые получаются в ходе действия. |
|
Вернуться к началу |
|
|
atas Гость цитировать
|
Добавлено: 02 Июн 2008 17:10:40 Заголовок сообщения: |
|
|
to Hellbot
Цитата: |
Да в том то все и дело, что маппинг сделан визуально правильно, ничего там такого не работающего нету.
|
kak nado? tak:
Код: |
var $belongsTo = array(
'Invoice' => array(
'className' => 'Invoice',
'foreignKey' => 'invoice_id'
)
);
|
ili tak:
Код: |
var $belongsTo = array(
'Invoice' => array(
'className' => 'Invoice',
'foreignKey' => 'id'
)
);
|
vot kod na index action back_orders_controller.php
Код: |
function index($page = 1)
{
//$this->checkSession(); //authorization
// $this->checkRole(1); //authorization
///////------paging-------//////
$records_per_page = $this->INNT_getRecordsPerPage();
///////------/paging-------//////
$this->set('products_key_value', $this->INNT_getListproduct());
$this->set('productsSKU_key_value', $this->INNT_getListproductSKU());
$this->set('back_orders', $this->BackOrder->findAll(null, null, "id DESC", $records_per_page, $page));
$this->set('page',$page);
///////------paging-------//////
$records_count = $this->BackOrder->findCount();
$this->set('paging_line', $this->INNT_table_paging_line($page, $records_count, $records_per_page));
///////------/paging-------//////
// ------ save current page for pagination ------- //
$_SESSION["current_page_back_orders"] = $page;
// ---/--- save current page for pagination ------- //
}
|
kak ja i pisal v pervom voste: esli ja komentiruju mapping, to vse rabotaet velikolepno, tolko net svjazki mezhdu tablitsami, a eto delaetsja mappingom. ili ja choto ne doponimaju?
spasibo |
|
Вернуться к началу |
|
|
Hellbot
цитировать
Зарегистрирован: 19 Май 2008 16:29:15 Сообщения: 34
|
Добавлено: 02 Июн 2008 17:25:28 Заголовок сообщения: |
|
|
Я не знаю каким образом проверить это у себя.
Если таблица
Invoices - что-то там внутри не важно
и таблица
BackOrders
с полями id и invoice_id - то маппинг прописан правильно (foreignKey = invoice_id).
Вообще надо смотреть запрос SQL который генерирует cake (debug = 2) |
|
Вернуться к началу |
|
|
Hellbot
цитировать
Зарегистрирован: 19 Май 2008 16:29:15 Сообщения: 34
|
Добавлено: 02 Июн 2008 17:29:48 Заголовок сообщения: |
|
|
Возможно у вас $this->BackOrder->findAll возвращает false или пустой результат, потому что выполняется не корректный запрос. |
|
Вернуться к началу |
|
|
atas Гость цитировать
|
Добавлено: 02 Июн 2008 17:49:29 Заголовок сообщения: |
|
|
to Hellbot
na etom zaprose
Цитата: |
SELECT `BackOrder`.`id`, `BackOrder`.`route_code`, `BackOrder`.`product_id`, `BackOrder`.`back_order_quantity`, `BackOrder`.`production_id`, `BackOrder`.`invoice_id`, `Invoice`.`id`, `Invoice`.`invoices_date`, `Invoice`.`customer_id`, `Invoice`.`route_code`, `Invoice`.`salesman_id`, `Invoice`.`exported_flag`, `Invoice`.`PO_number`, `Invoice`.`shipment_date`, `Invoice`.`exported_flag_quickbooks` FROM `back_orders` AS `BackOrder` LEFT JOIN `invoices` AS `Invoice` ON (`BackOrder`.`invoice_id` = `Invoice`.`id`) WHERE 1 = 1 ORDER BY `id` DESC LIMIT 10
|
vipadaet oshibka
Цитата: |
1052: Column 'id' in order clause is ambiguous
|
No esli ja ruchkami podpravil kod (v meste ORDER BY id) vot tak:
Код: |
SELECT `BackOrder`.`id`, `BackOrder`.`route_code`, `BackOrder`.`product_id`, `BackOrder`.`back_order_quantity`, `BackOrder`.`production_id`, `BackOrder`.`invoice_id`, `Invoice`.`id`, `Invoice`.`invoices_date`, `Invoice`.`customer_id`, `Invoice`.`route_code`, `Invoice`.`salesman_id`, `Invoice`.`exported_flag`, `Invoice`.`PO_number`, `Invoice`.`shipment_date`, `Invoice`.`exported_flag_quickbooks` FROM `back_orders` AS `BackOrder` LEFT JOIN `invoices` AS `Invoice` ON (`BackOrder`.`invoice_id` = `Invoice`.`id`) WHERE 1 = 1 ORDER BY `BackOrder`.`id` DESC LIMIT 10
|
to sql zarabotal. Znachit kak Vi i pisali u menja problema v controllere
Цитата: |
$this->set('back_orders', $this->BackOrder->findAll(null, null, "id DESC", $records_per_page, $page));
|
ispravil na :
Цитата: |
$this->set('back_orders', $this->BackOrder->findAll(null, null, "BackOrder.id DESC", $records_per_page, $page));
|
i vse Zarabotalo.
Spasibo Vam bolshoe |
|
Вернуться к началу |
|
|
atas Гость цитировать
|
Добавлено: 02 Июн 2008 17:54:36 Заголовок сообщения: |
|
|
to Administrator
hotel neskolko raz u Vas na sajte zaregistrirovatsja, no kazdij raz viletaet soobshenie:
Цитата: |
Вы исчерпали предельное количество попыток регистрации для данной сессии. Повторите попытку позднее.
|
|
|
Вернуться к началу |
|
|
|
|
Вы можете начинать темы Вы можете отвечать на сообщения Вы можете редактировать свои сообщения Вы можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group Русская поддержка phpBB
|