2013-05-09 26 views
8

Tôi đang cố gắng để có được các mô hình liên kết của tôi trong CakePHP 2.3 để lưu đúng cách, nhưng tôi đang gặp sự cố. Tôi đang lưu trữ bài đăng và tôi muốn biết những liên kết nào nằm trong các bài đăng đó. Đối với mỗi liên kết đó, tôi muốn lưu trữ văn bản liên kết nếu nó có sẵn. Cơ sở dữ liệu của tôi được thiết lập như trong sơ đồ sau.CakePHP saveAssociated không lưu HasMany Thông qua Mẫu dữ liệu

Database Diagram http://derekperkins.com/wp-content/uploads/cakephp-database.png

Neo Mẫu

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 mẫu

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 Mẫu

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' 
     )*/ 
    ); 
} 

bài mẫu

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); 
    } 
} 

Nộp dữ liệu

tôi đã tạo ra một hình thức để kiểm tra mô hình của tôi. Đây là mã tôi đang sử dụng để lưu mảng được tạo bởi biểu mẫu. Tôi nhận được một thông báo nói rằng mọi thứ đã được lưu thành công, nhưng chỉ có bài lưu. Không có gì được nhập vào ba bảng khác. Tôi cũng đang sử dụng DebugKit và không có cuộc gọi SQL nào tham chiếu đến bất kỳ dữ liệu nào.

$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 
     ) 
) 

Tôi cũng đã cố định dạng mảng của mình để có URL và neo bên dưới PostsUrl dưới dạng một phần phụ, nhưng điều đó cũng không hoạt động.

Mô hình của tôi :: lưu các chức năng ở đó để giữ cho tôi sao chép dữ liệu và chúng hoạt động bình thường trong các mô hình khác mà tôi đã sử dụng trước đây (mặc dù tôi đang mở để gợi ý cách tốt hơn để làm điều này sử dụng một cuộc gọi cơ sở dữ liệu cho mỗi kiểm tra). Tôi cũng đã cố gắng bình luận chúng ra, và nó không ảnh hưởng đến mã của tôi. Làm thế nào tôi nên cấu trúc này để tiết kiệm đúng cách?

+1

Bạn đã cố gắng 'saveAll() 'và' saveAssociated() '? –

+1

Bạn đã thử lưu bằng một trong các phím liên quan (URL hoặc Anchor) để xem liệu một trong số đó có gây ra sự cố không? Cũng có thể có giá trị cố gắng để đưa vào một khóa PostsUrl với một mảng đánh số và đặt các URL và các phím neo trong một trong số đó (ví dụ Array ([PostsUrl] => Array (0 => Array ('Url' => Array (. ..), 'Anchor' => Array (..))) sau đó sử dụng SaveAll –

Trả lời

3

Trước hết về mẫu bạn :: save chức năng, ví dụ:

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); 
} 

nó in dữ liệu $ theo cách này:

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 
     ) 
) 

$ dữ liệu này là không chính xác, các dữ liệu chính xác là :

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 
      ) 
    ) 

Bạn phải thay đổi Mô hình :: lưu chức năng theo cách này:

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); 
} 

thứ hai, bạn không thể lưu dữ liệu này với đơn tiết kiệm, bạn nên lưu dữ liệu của bạn theo cách này:

$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

Tại sao tôi không thể lưu URL/Dữ liệu neo trong cùng một cuộc gọi? Đó không phải là lý do tại sao bạn có thể thực hiện cuộc gọi saveAssociated sâu? –

Các vấn đề liên quan