2013-04-11 16 views
5

Nếu bảng có mặc định trên một số trường nhất định và NULL không được phép, người ta sẽ mong đợi tập lệnh chèn để sử dụng những mặc định đó, như MariaDB/MySQL thường làm. Ví dụ, nếu các sản phẩm bảng có một lĩnh vực AI "id", một trường "Tên" yêu cầu và hai trường bắt buộc "hoạt động" và "đặc trưng" mà cả hai mặc định là 1, sau đó truy vấnLàm thế nào để làm cho các mô hình sử dụng mặc định trong Phalcon PHP Framework?

INSERT INTO products (name) VALUES ('someName'); 

sẽ tự động chèn 1 là giá trị của hoạt động và nổi bật. Tuy nhiên, khi sử dụng mô hình Phalcon của như vậy:

$product = new Products(); 
$product->setName('someName'); 
$product->save(); 

lỗi trở lại xác nhận nói rằng "hoạt động" và "đặc trưng" được yêu cầu.

Có một lá cờ tôi nên cung cấp trong quá trình tạo mô hình để các công cụ Phalcon thu thập và nhập mặc định vào các Lớp mô hình hay cách khác để Phalcon tự động sử dụng các giá trị mặc định nếu tìm thấy? Cách tiếp cận tốt nhất sẽ chỉ là bỏ qua các lĩnh vực mà không được thiết lập, tôi nghĩ. Tôi có thể làm cho các mô hình làm điều đó?

Trả lời

9

Bạn có thể sử dụng một giá trị cơ sở dữ liệu thô để tránh điều đó, trong chèn cụ thể:

<?php 

use Phalcon\Db\RawValue; 

$product = new Products(); 
$product->setName('someName'); 
$product->setType(new RawValue('default')); //use default here 
$product->save(); 

Hoặc, nói chung trước khi tạo/cập nhật cho các lĩnh vực cụ thể:

use Phalcon\Db\RawValue; 

class Products extends Phalcon\Mvc\Model 
{ 
    public function beforeValidationOnCreate() 
    { 
     $this->type = new RawValue('default'); 
    } 
} 

Hoặc bỏ qua các trường này trong mỗi SQL INSERT được tạo:

use Phalcon\Db\RawValue; 

class Products extends Phalcon\Mvc\Model 
{ 
    public function initialize() 
    { 
     $this->skipAttributesOnCreate(array('type')); 
    } 
} 
+1

Brilliant, nhờ – Swader

+0

cải tiến @twistedxtra nhỏ: '$ this-> gõ = $ this-> gõ: RawValue mới ('mặc định');'?. Nhưng trong mọi trường hợp - cảm ơn! :) – klay

2

Mặc dù tôi tìm thấy câu trả lời của Twistedxtra hấp dẫn từ aspe ct rằng Phalcon chứa phương pháp này để đọc mặc định cột, tôi tin từ quan điểm kiến ​​trúc này có thể là phương pháp sai khi bạn dựa vào cơ sở dữ liệu của bạn để xác định mặc định của các thuộc tính của mô hình của bạn.

Tôi sẽ đặt giá trị mặc định khi khai báo thuộc tính và giữ logic trong lớp ứng dụng. Nhưng đó chỉ là tôi.

+0

Cách tiếp cận kiến ​​trúc "đúng" có phải là để thực thi một mặc định như vậy ở cấp DB không? Ít nhất theo cách đó bạn không bao giờ kết thúc với dữ liệu xấu. –

0

Sử dụng Giống như dưới đây

Các skipAttributesOnCreate sẽ đảm bảo Phalcon không cố gắng để đặt một giá trị trong cột đó. Cơ sở dữ liệu sẽ áp dụng giá trị mặc định.

public function initialize() 
{ 
    $this->setSource('table_name'); 
    $this->skipAttributesOnCreate(['name_of_column']); 
} 
+1

Xin chào Deji, chào mừng bạn đến với StackOverflow. Khi trả lời câu hỏi ở đây, bạn nên luôn luôn cung cấp giải thích và mô tả để giúp giải quyết vấn đề trong tầm tay. Việc đăng một khối mã thường không hữu ích và nó không cung cấp ngữ cảnh. Vui lòng xem xét cập nhật câu trả lời của bạn tại đây. –

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