2017-01-05 8 views
0

CakePHP에 대한 작은 프로젝트가 있습니다. 기사라는 테이블과 카테고리, 태그, 이미지 등과 같은 5 개의 테이블 필드가 있습니다. 연관은 대부분 HasOne이고 관련 테이블에는 여러 개의 열이 있습니다. 기사에 데이터를 저장할 때 테이블 모든 것이 좋아 보인다하지만 일부 단체에, 예를 들어 : 기사 -> 평가, 나는 널 (null)로 저장되고 평가 테이블의 일부 필드, 최대 기입하지 않은 경우 :CakePHP 빈 연결 필드가 무시 대신 저장됩니다.

+----+------------+--------------+ 
| id | article_id | rating_value | 
+----+------------+--------------+ 
| 1 |   36 |   3 | 
| 2 |   56 |  5454.56 | 
| 3 |   57 |   4 | 
| 5 |   51 |   NULL | 
+----+------------+--------------+ 

을 몇 가지 유효성 검사를 추가하면 유효성 검사가 필요한만큼 기사를 저장할 수 없습니다. 내가 원했던 것은 rating_value가 비어 있으면 null (엔티티 거부)으로 작성되어서는 안되며 아티클을 저장해야한다는 것입니다. 기사 삭제가 예상대로 작동하면 관련된 모든 항목이 삭제됩니다.

Model.beforeMarshall에서 $ 데이터를 변경하려고 시도했지만 클래스가 개인용 테이블 및 등급 (내 생각으로는 연결이 문제 일 수 있음).

일부 코드 (컨트롤러 추가는) :

public function add() 
    { 
    $article = $this->Articles->newEntity(); 
    if ($this->request->is('post')) { 
       $article = $this->Articles->patchEntity($article, $this->request->data, [ 
        'associated' => [ 
         'Ratings', 
        ] 
       ]); 
       if ($this->Articles->save($article)) { 
        $this->Flash->success(__('Saved.')); 
        return $this->redirect(['action' => 'index']); 
       } 
    } 
    $this->set('article', $article); 
} 

나는 이것 때문에 모든 관련 모델의 모든 검증을 삭제.

// Articles Table 
$this->hasOne('Ratings', [ 
    'className' => 'Ratings', 
    'dependent' => true, 
]); 

// Ratings Table 
$this->belongsTo('Articles', [ 
    'foreignKey' => 'article_id', 
    'joinType' => 'INNER' 
]); 
// Rating.php Entity 
protected $_accessible = [ 
    '*' => true, 
    'id' => false 
]; 
// Article.php Entity 
protected $_accessible = [ 
    '*' => true, 
]; 
+0

"** _ 나는 Model.beforeMarshall에 $ 데이터를 변경 시도 _ **"... 그 (방법 중 하나 이상)를 갈 수있는 방법대로 시도했다 보여준다. 또한 "** _ 클래스는 비공개 _ **"입니다.이 문장은 실제로 나에게 의미가 없습니다. – ndm

+0

문서에 대한 'var_dump ($ 데이터)'표시'개체 (ArrayObject) [272] private 'storage'=> ...'그리고 나는 데이터를 수정할 수 없으며 Ratings.beforeMarshall과 동일한'object (ArrayObject) [231] private 'storage'=> ... ' –

+0

그게 [** 배열 객체 **] (http://php.net/arrayobject)를 덤프하는 것은 그 내부 구조는 비공개이지만 데이터 제한없이 액세스 할 수 있습니다. 다른 배열을 편집하는 것처럼'$ data'를 편집하십시오. ** https : //book.cakephp.org/3.0/en/orm/saving-data.html#modifying-request-data-before-building-entities** – ndm

답변

0

나는 모든 것이 멋지게 보입니다. 테이블의 입력란이 기본값으로 null 일 수 있습니다. 예를 들어 :

debug($this->request->data); 

을 그리고 데이터 경우가 보면 : 유효성 검사가 그 당신은 여전히 ​​당신을 위해 작동하지 않는 널 value.If를 저장하는 것보다 아무것도하지 않고 저장주지 않는다 실패하면

If 'rating_value' field in your table has default value null, 
make that default full to none first. 

참조 귀하의 견해 (양식)에서 올바르게 나오고 있습니다. 또 다른 중요한 점은 연관성에 대해 서로 다른 유효성 검사 집합을 사용할 수 있다는 것입니다. (see here)

+0

디폴트 값이 널 (NULL)이 아닌 경우 다음과 같습니다.'오류 : SQLSTATE [23000] : 무결성 제약 조건 위반 : 1048 'rating_value'열은 null 일 수 없습니다. ' –

+0

mysql에 데이터를 삽입하기위한 트리거를 정의 했습니까? 그렇지 않으면 당신의 rating_value는 여전히 null로 갈 것입니다. 당신은 debug ($ this-> request-.data)를 볼 필요가 있습니다. –

0

rating_value를 설정하면 모든 유효성 검사 규칙을 저장하고 유효성을 검사합니다.

You can remove the associated data if rating_value is empty like this

$dataToSave = $this->request->data; 
if(empty($dataToSave['rating']['rating_value'])){ 
    unset($dataToSave['rating']); 
} 
$article = $this->Articles->patchEntity($article, $dataToSave, [ 
    'associated' => [ 
     'Ratings', 
    ] 
]); 
+0

작동하는 것처럼 보이지만 컨트롤러가 이것을 수행하는 가장 좋은 장소입니까? 나는 하나의 비어있는 항목을보기 위해 foreach 항목을 추가하고, acitons를 추가/편집 할 때 item comprobation을 추가한다는 것을 의미한다. –