2015-05-07 19 views
6

Tôi có một biểu mẫu thu thập dữ liệu về một Điều, và tôi muốn lưu dữ liệu đó, cũng như cho một mô hình được gọi là Tóm tắt, trong đó một Điều có nhiều tóm tắt. Mô hình của tôi trông như thế này:Lưu mô hình liên quan trong Cakephp 3

namespace App\Model\Table; 

use Cake\ORM\Table; 
use Cake\Validation\Validator; 

class AbstractsTable extends Table 
{ 
public function initialize(array $config) 
{ 
    $this->belongsTo('Articles'); 
} 

public function validationDefault(Validator $validator) 
{ 
    $validator 
     ->notEmpty('body'); 
    return $validator; 
} 
} 

namespace App\Model\Table; 

use Cake\ORM\Table; 
use Cake\Validation\Validator; 

class ArticlesTable extends Table 
{ 
    public function initialize(array $config) 
    { 
     $this->addBehavior('Timestamp'); 
     $this->hasMany('Abstracts'); 
    } 

public function validationDefault(Validator $validator) 
    { 
     $validator ->notEmpty('category') 
     return $validator; 
    } 
} 

hình thức đầu vào của tôi có một trường có tên là 'abstracts.body', và trong ArticlesController của tôi, tôi có chức năng này:

public function add() 
    { 
      $data = $this->request->data; 
      $article = $this->Articles->newEntity($data, [ 
          'associated' => ['Abstracts'] 
        ]); 
     if ($this->request->is('post')) { 
        $article->user_id = $this->Auth->user('id'); 
        $data['abstracts']['user_id'] = $article->user_id; 
        $data['abstracts']['approved'] = 0; 
        $article = $this->Articles->patchEntity($article, $data, [ 
           'associated' => ['Abstracts'] 
          ]); 

      if ($this->Articles->save($article, [ 'validate' => false, 
                'associated' => ['Abstracts'] 
               ])) 
       { 
         $this->Flash->success(__('Your article has been saved.')); 
         return $this->redirect(['action' => 'index']); 
       } 
      $this->Flash->error(__('Unable to add your article.')); 
      } 
      $this->set('article', $article); 
    } 

Bảng Tóm tắt của tôi khá đơn giản:

CREATE TABLE 'abstracts' ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 'article_id' INTEGER , 'user_id' INTEGER , 'body' TEXT, 'approved' BOOLEAN) 

Từ gỡ lỗi Tôi có thể thấy rằng tôi có mảng 'tóm tắt' chính xác trong dữ liệu $ của tôi (trong add()), nhưng nó dường như không bao giờ cố gắng lưu nó vào cơ sở dữ liệu. Ai đó có thể vui lòng chỉ ra lỗi của tôi? Cảm ơn!

+0

hiển thị 'debug ((string) $ article)' trước khi gọi lưu, vui lòng –

+0

Lưu ngày của tôi :) PatchEntity() với bit được liên kết. –

Trả lời

3

Bạn đang xử lý các mảng $ data ['abstracts'] của mình không chính xác dẫn đến kết hợp không được lưu. $ data ['abstracts'] được mong đợi là một mảng của Abstracts. vấn đề của bạn nằm ở đây:

$data['abstracts']['user_id'] = $article->user_id; 
$data['abstracts']['approved'] = 0; 

Bạn sẽ có thể khắc phục điều này khá dễ dàng bằng cách thay đổi này để:

foreach($data['abstracts'] as $index => $abstract) { 
    $abstract['user_id'] = $article->user_id; 
    $abstract['approved'] = 0; 
    $data['abstracts'][$index] = $abstract; 
} 

này nên lặp một cách chính xác trên mảng lại tóm tắt, thiết lập user_id và các phím đã được phê duyệt một cách thích hợp và sau đó nó nên lưu một cách chính xác.

CakePHP 3.x Documentation on Saving Associations

EDIT: Rất thú vị vấn đề thực sự. Hãy thử nó mà không sử dụng patchEntity, và sử dụng newEntity bởi chính nó thay vì:

public function add() 
{ 

    if ($this->request->is('post')) { 
     $data = $this->request->data; 

     // Post process abstracts objects 
     foreach($data['abstracts'] as $index => $abstract) { 
      $abstract['user_id'] = $article->user_id; 
      $abstract['approved'] = 0; 
      $data['abstracts'][$index] = $abstract; 
     } 

     // Build newEntity 
     $article = $this->Articles->newEntity($data, [ 
      'associated' => ['Abstracts'] 
     ]); 

     // Save our entity with associations 
     if ($this->Articles->save($article, [ 
      'validate' => false, 
      'associated' => ['Abstracts'] 
     ])) { 
      $this->Flash->success(__('Your article has been saved.')); 
      return $this->redirect(['action' => 'index']); 
     } 

     // On save fail 
     $this->Flash->error(__('Unable to add your article.')); 
     $this->set('article', $article); 
    }  
}  

EDIT 2: vấn đề của bạn có vẻ như nó chắc chắn là dưới hình thức trợ giúp của bạn. đầu vào hình thức helper hiện tại của bạn sẽ tạo ra một mảng $ dữ liệu mà trông như thế này:

$data = [ 
    'abstracts' => [ 
     'body' => 'example text' 
    ], 
    'category' => 'Science' 
]; 

nào NÊN trông giống như:

$data = [ 
    'abstracts' => [ 
     ['body' => 'example text'], 
     ['body' => 'Im your second abstract'], 
     ['body' => 'Abstract three!'] 
    ], 
    'category' => 'Science' 
]; 

Vấn đề nằm ở chỗ:

abstracts.body 

nào nên đọc như (trong ký hiệu dấu chấm mảng):

// abstracts.0.body 
echo $this->Form->input('abstracts.0.body', [ 
    'label' => 'summary of article', 
    'maxlength' =>'440', 
    'rows' => '7' 
]); 

Tôi tin rằng đó sẽ là vấn đề cuối cùng bạn gặp phải.

+0

Vẫn không hoạt động. Tôi không nghĩ rằng bạn đang đúng trong vấn đề của tôi là có (hoặc ít nhất, vấn đề ONLY của tôi là không có). Tôi biết điều này bởi vì tôi có thể nhận xét rằng toàn bộ phần và nó vẫn không chèn. Ví dụ. // $ data ['abstracts'] ['user_id'] = $ article-> user_id; // $ data ['abstracts'] ['approved'] = 0; Hành vi chính xác giống nhau. Biểu mẫu của tôi trông giống như: echo $ this-> Form-> input ('abstracts.body', ['label' => 'tóm tắt bài viết', 'maxlength' => '440', 'rows' => '7']); – km27

+0

Kiểm tra chỉnh sửa của tôi cho câu trả lời của tôi và nếu giải pháp đó không hoạt động, vui lòng đăng bản sao() của mảng dữ liệu $ trước khi xử lý và sau khi xử lý. –

+0

Ngoài ra, điều này có thể không liên quan, nhưng hãy kiểm tra thuộc tính $ _accessible trong AbstractEntity.php, bạn có thể không có thuộc tính 'body' của bạn được thiết lập để truy cập thông qua gán hàng loạt (với newEntity và patchEntity). Tôi không tin rằng đây là trường hợp bởi vì bạn có 'validate => false' được đặt trên chức năng lưu của bạn, nhưng tôi không chắc liệu điều đó có tắt xác thực cho các thực thể liên quan không. –

4

OK.

tôi bắt đầu đi sai ở đây:

My input form has a field named 'abstracts.body' 

Bởi vì đó là một mối quan hệ hasMany, tôi cần phải có đầu vào mà là 'abstracts.0.body '

Sau đó, phần còn lại của câu trả lời của LeWestopher sẽ hoạt động-- thêm chỉ mục vào các trường tôi muốn điền vào từ Bộ điều khiển, vì vậy $ data [abstracts] [0] [' user_id '] => ... và vân vân. Cảm ơn!

+0

Hoàn hảo! Vui vì bạn đã tìm ra. –

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