2013-05-09 13 views
8

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ć?

+1

wypróbowaniu 'saveAll()' i 'saveAssociated()'? –

+1

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 –

Odpowiedz

3

Przede wszystkim o swoim modelu :: save funkcji, na przykład:

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']; 

    pr($data); 

    return parent::save($data, $validate, $fieldList); 
} 

drukuje $ dane w następujący sposób:

Array 
(
    [id] => 3 //for example 3 
    [Post] => Array 
     (
      [external_post_id] => 12345 
      [sentiment_score] => 3.3 
     ) 

    [URL] => Array 
     (
      [url] => http://test.com 
     ) 

    [Anchor] => Array 
     (
      [anchor] => Test Anchor 
     ) 
) 

to $ dane są błędne, prawidłowe dane :

Array 
    (
     [Post] => Array 
      (
       [id] => 3 //for example 3 
       [external_post_id] => 12345 
       [sentiment_score] => 3.3 
      ) 

     [URL] => Array 
      (
       [url] => http://test.com 
      ) 

     [Anchor] => Array 
      (
       [anchor] => Test Anchor 
      ) 
    ) 

musisz zmienić swój model :: save funkcja w ten sposób:

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[$this->name]['id'] = $id['Post']['id']; 

    return parent::save($data, $validate, $fieldList); 
} 

drugie, nie można zapisać dane z pojedynczego zapisu, należy zapisać dane w następujący sposób:

$postData = array 
(
    'Post' => array 
     (
      'external_post_id' => 12345 
      'sentiment_score' => 3.3 
     ) 
); 

$this->Post->save($data); 

$postUrlId = $this->PostsUrl->find('first', array(
'conditions' => array(
        'post_id' => $this->Post->id 
        ), 
'fields' => array('id') 
)); 

$urlAnchorData = array(
    'URL' => array 
     (
      'url' => 'http://test.com' 
     ), 
    'Anchor' => array 
     (
      'anchor' => 'Test Anchor' 
     ), 
    'PostsUrl' => array(
      'id' => $postUrlId['PostsUrl']['id'] 
    ) 
); 

$this->PostsUrl->saveAll('$urlAnchorData'); 
+1

Dlaczego nie mogę zapisać adresu URL/danych zakotwiczenia w tym samym wywołaniu? Czy to nie jest powód, dla którego możesz wykonać głębokie zapisanie powiązanego połączenia? –

Powiązane problemy