Próbuję uzyskać moje skojarzone modele w CakePHP 2.3, aby zapisać poprawnie, ale mam problemy. Przechowuję posty i chcę wiedzieć, jakie linki znajdują się w tych wpisach. W przypadku każdego z tych linków chcę zachować tekst zakotwiczenia, jeśli jest dostępny. Moja baza danych jest skonfigurowana jak na poniższym schemacie.CakePHP saveAssociated nie zapisując HasMany poprzez dane modelu
Database Diagram http://derekperkins.com/wp-content/uploads/cakephp-database.png
Kotwica model
class Anchor extends AppModel {
public $hasMany = array(
'PostsUrl' => array(
'className' => 'PostsUrl',
'foreignKey' => 'anchor_id',
'dependent' => false
)
);
public function save($data = NULL, $validate = true, $fieldList = array()) {
$id = Anchor::find('first', array(
'fields' => array('id'),
'recursive' => -1,
'conditions' => array('anchor' => $data['anchor'])
));
if($id)
$data['id'] = $id['Anchor']['id'];
return parent::save($data, $validate, $fieldList);
}
}
URL modelu
class Url extends AppModel {
public $hasMany = array(
'PostsUrl' => array(
'className' => 'PostsUrl',
'foreignKey' => 'url_id',
'dependent' => false
)
);
public function save($data = NULL, $validate = true, $fieldList = array()) {
$id = Url::find('first', array(
'fields' => array('id'),
'recursive' => -1,
'conditions' => array('url' => $data['url'])
));
if($id)
$data['id'] = $id['Url']['id'];
return parent::save($data, $validate, $fieldList);
}
}
PostsUrl model
class PostsUrl extends AppModel {
public $belongsTo = array(
'Post' => array(
'className' => 'Post',
'foreignKey' => 'post_id'
),
'Url' => array(
'className' => 'Url',
'foreignKey' => 'url_id'
'Anchor' => array(
'className' => 'Url',
'foreignKey' => 'anchor_id'
)*/
);
}
post model
class Post extends AppModel {
public $hasMany = array(
'PostsUrl' => array(
'className' => 'PostsUrl',
'foreignKey' => 'post_id',
'dependent' => false
)
);
public function save($data = NULL, $validate = true, $fieldList = array()) {
$id = Post::find('first', array(
'fields' => array('id'),
'recursive' => -1,
'conditions' => array('external_post_id' => $data['external_post_id'])
));
if($id)
$data['id'] = $id['Post']['id'];
return parent::save($data, $validate, $fieldList);
}
}
przekazywania danych
I utworzeniu formularza, aby przetestować mojego modelu. To jest kod, którego używam do zapisania tablicy utworzonej przez formularz. Otrzymuję komunikat, że rzeczy zostały pomyślnie zapisane, ale tylko zapisuje post. Nic nie jest wprowadzane do pozostałych trzech tabel. Używam również DebugKit i żadne odwołania SQL nie odwołują się do żadnego z tych danych.
$this->Post->saveAssociated($this->request->data, array('deep' => true))
Array
(
[Post] => Array
(
[external_post_id] => 12345
[sentiment_score] => 3.3
)
[URL] => Array
(
[url] => http://test.com
)
[Anchor] => Array
(
[anchor] => Test Anchor
)
)
Ja również próbował formatowania moje tablice mieć URL and Anchor pod spodem PostsUrl jako subarray, ale to nie działało.
Funkcje My Model :: Save powstrzymują mnie od duplikowania danych i działają poprawnie w innych modelach, z których korzystałem w przeszłości (choć jestem otwarty na sugestie, jak to zrobić lepiej, ponieważ używa wywołania bazy danych dla każdej kontroli). Próbowałem też je komentować i nie wpłynęło to na mój kod. Jak mam to zorganizować, aby odpowiednio zapisać?
wypróbowaniu 'saveAll()' i 'saveAssociated()'? –
Czy wypróbowałeś save za pomocą jednego z powiązanych kluczy (URL lub Anchor), aby sprawdzić, czy któryś z nich powoduje problem? Warto również spróbować wstawić klucz postsUrl z numerowaną tablicą i umieścić w nim adresy URL i klucze zakotwiczenia (np. Array ([PostsUrl] => Array (0 => Array ("Url" => Array (. ..), 'Anchor' => Array (..))) następnie użyj SaveAll –