Список форумов Cake-PHP.ru Cake-PHP.ru
Форум программистов CakePHP
(на сайт)
 
 Watched TopicsWatched Topics   FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

cakePHP relational mapping problem

 
Начать новую тему   Ответить на тему    Список форумов Cake-PHP.ru -> Общий
Предыдущая тема :: Следующая тема  
Автор Сообщение
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>&nbsp; &nbsp;</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)?>
               
        &nbsp; &nbsp;
       
        <?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)?>
               
        &nbsp;
       
     
         </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 Smile

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 Smile
Вернуться к началу
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:

Цитата:

Вы исчерпали предельное количество попыток регистрации для данной сессии. Повторите попытку позднее.
Вернуться к началу
Имя
Сообщение

Смайлики
Very Happy Smile Sad Surprised
Shocked Confused Cool Laughing
Mad Razz Embarassed Crying or Very sad
Evil or Very Mad Twisted Evil Rolling Eyes Wink
Exclamation Question Idea Arrow
Дополнительные смайлики

 
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Cake-PHP.ru -> Общий Часовой пояс: GMT + 3
Страница 1 из 1

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


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB

Рейтинг@Mail.ru