Ассоциация моделей Cakephp - PullRequest
0 голосов
/ 09 января 2012
   //index.ctp, this forms points to action updateData in profilesController
   $this->Form->input('User.lastname');
   $this->Form->input('Profile.age');
   $this->Form->input('Profile.height');
   $this->Form->input('Associate.city');
   $this->Form->end('Submit');

//user.php 
Class User extends AppModel {
      var $hasOne = array('Profile', 'Associate'};
      var $primaryKey = 'user_id';

}

//profile.php
Class Profile extends AppModel {
   var $belongsTo = array('User');
   var $hasOne = 'Associate';
   var $primaryKey = 'user_id';
}

//associate.php
Class Associate extends AppModel {
   var $belongsTo = array('User');
   var $primaryKey = 'user_id';
}

 //profiles_controller.php

    Class ProfilesController extends AppController{

    function updateData(){

       //output incoming request for debugging purposes
       debug($this->request->data);

       //here i fetch the db to get the id of user
       $options = 
       array('conditions' => array('User.username' => $this->Auth->user('username')),
                 'fields' => array('User.id')
               );

               //find user id so we can find user in related tables
               $id = $this->Profile->User->find('first', $options);

               //here I modify request data so cakephp finds the users through primaryKeys
               $this->request->data['Profile']['user_id'] = $id['User']['id'];
               $this->request->data['Associate']['user_id'] = $id['User']['id'];
               $this->request->data['User']['id'] = $id['User']['id'];



       if($this->request->is('post'){
       //this updates data in table no problem
       $this->Profile->save($this->request->data);
       //this updates data in table no problem either
       $this->Profile->Associate->save($this->request->data);
       //this returns false...it breaks here
       $this->Profile->User->save($this->request->data);


       }

    }

}

Структура таблицы:

User
|id|int|auto increment
|firstname|varchar
|lastname|varchar
|date|timestamp

Profile
|id|int|autoincrement
|user_id|int
|age|int
|height|int

Associate
|id|int|autoincrement
|user_id|int
|city|varchar
|country|varchar

Хорошо, я знаю, что некоторые из вас могут сказать мне, почему я делаю это на контроллерах profileController, а не на UsersController.Ну, моя идея состоит в том, чтобы отделить некоторые действительно важные пользовательские данные от данных профиля, поэтому я собираюсь написать код для профиля на ProfilesController ... когда я разрабатывал, я предполагал, что та же ассоциация моделей автоматически обновит пользователяПоле .lastname в таблице User..но это та часть, где мой код ломается, и я пытался, но я не могу заставить его работать

Текущая связь, по крайней мере, в моей голове выглядит следующим образом:

У пользователя есть один профиль. У пользователя есть один ассоциированный профиль. Он принадлежит пользователю. Ассоциированный принадлежит профилю и пользователю.

Может кто-нибудь сказать мне, что я делаю неправильно?я придерживаюсь того, что я считаю логичным подходом для моего приложения, cakephp обновляет модели Profile и Associate, но пользователь остается неизменным.

Ответы [ 2 ]

1 голос
/ 09 января 2012

Предполагая, что primaryKey вашей пользовательской таблицы равен 'id', просто удалите все строки $primaryKey и повторите попытку.

Единственная причина для установки первичного ключа состоит в том, что он не следует по умолчанию, установленному CakePHP. Я бы УГОВОРИЛ (не вижу ваших таблиц), что поле primaryKey в вашей таблице 'users' не является 'user_id' - скорее всего, это просто 'id', а в других таблицах это 'user_id'. Если это так, нет необходимости указывать $primaryKey, так как это по умолчанию CakePHP.

0 голосов
/ 10 января 2012

Как выяснилось после прочтения документации на CakePHP (и, очевидно, это n00b), причина, по которой мой код ломался, заключается в том, что в моей модели был обратный вызов beforeSave.Я не знал, что для сохранения данных мне пришлось отключить обратный вызов, который не был связан с той частью кода, которую я вам представил.Решение в таком случае заключается в следующем:

$this->Profile->User->save($this->request->data, array('callbacks' => false));

Я вас не знаю, ребята, но иногда я чувствую, что документация к CakePHP слишком упрощена, я узнаю это, посмотрев на API,

...