2012-03-02 8 views
5

Sử dụng chú thích là khá đơn giản để thiết lập một giá trị mặc định cho một cột nhất định và khởi tạo bộ sưu tập cho các mối quan hệ thực thể:Giá trị cột mặc định với Doctrine2 và Symfony2 sử dụng YAML?

use Doctrine\Common\Collections\ArrayCollection; 

class Category 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\OneToMany(targetEntity="Product", mappedBy="category") 
    */ 
    protected $products; 

    /** 
    * @ORM\Column(type="bool") 
    */ 
    protected $is_visible; 

    public function __construct() 
    { 
     $this->products = new ArrayCollection(); 
     $this->is_visible = true; // Default value for column is_visible 
    } 
} 

Làm thế nào cùng có thể đạt được bằng YAML nét thay vào đó, mà không tự viết Category.php? __construct() là phương pháp duy nhất để thực hiện việc này?

Acme\StoreBundle\Entity\Category: 
    type: entity 
    id: 
     id: 
      type: integer 
      generator: { strategy: AUTO } 
    fields: 
     is_visible: 
      type: bool 
    oneToMany: 
     products: 
      targetEntity: Product 
      mappedBy: category 

Trả lời

13

Tôi nghĩ bạn hiểu sai chú thích bằng cách nào đó vì giá trị mặc định được đặt qua php thuần túy.

/** 
* @ORM\Column(type="bool") <- This is an annotation 
*/ 
protected $is_visible; 

public function __construct() 
{ 
    $this->products = new ArrayCollection(); // <- This is not an annotation 
    $this->is_visible = true; // <- This is not an annotation 
} 

Không có sự khác biệt nào khi sử dụng ánh xạ YAML cho giá trị mặc định. Lý do rất đơn giản, ở đây làm thế nào bạn lớp đang tìm kiếm với chú thích:

use Doctrine\Common\Collections\ArrayCollection; 

class Category 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\OneToMany(targetEntity="Product", mappedBy="category") 
    */ 
    protected $products; 

    /** 
    * @ORM\Column(type="bool") 
    */ 
    protected $is_visible; 

    public function __construct() 
    { 
     $this->products = new ArrayCollection(); 
     $this->is_visible = true; // Default value for column is_visible 
    } 
} 

Và đây là cách nó trông giống với YAML lập bản đồ:

use Doctrine\Common\Collections\ArrayCollection; 

class Category 
{ 
    protected $id; 
    protected $products; 
    protected $is_visible; 

    public function __construct() 
    { 
     $this->products = new ArrayCollection(); 
     $this->is_visible = true; // Default value for column is_visible 
    } 
} 

Sự khác biệt trong ví dụ thứ hai là không có nhiều chú thích , vì ánh xạ được thực hiện thông qua YAML. Việc xây dựng lớp học được thực hiện chính xác như nhau. Do đó, các giá trị mặc định được đặt ở thời gian xây dựng được thực hiện bằng PHP thuần.

Không có sự khác biệt giữa chú thích và ánh xạ YAML cho tác vụ này. Vì vậy, dòng dưới cùng, bạn cần chỉnh sửa lớp PHP đã tạo để đặt các giá trị mặc định của bạn. Không có cách nào bạn có thể đặt nó trong YAML và để cho giáo lý đặt mã này cho bạn, ít nhất, tại thời điểm chúng ta nói.

Có thể tôi đã hiểu nhầm câu hỏi của bạn :), nếu đúng như vậy, đừng ngần ngại sửa tôi.

Hy vọng điều đó sẽ hữu ích.

Kính trọng,
Matt

+0

Chú thích không rõ ràng đối với tôi (có thể tiếng Anh của tôi không tốt để giải thích rõ). Nhưng bạn đã xác nhận những gì tôi đang nói: sử dụng YAML bạn phải chỉnh sửa lớp PHP đã tạo để thiết lập các giá trị mặc định, đúng không? Không có cách nào khác để làm điều này? – gremo

+1

Không có cách nào để thực hiện việc này bằng chú thích. Bạn phải tự thêm phương thức xây dựng và thêm giá trị mặc định. – Sgoettschkes

+0

Đúng, như bạn đã nói và @Boo xác nhận, bạn cần đặt giá trị mặc định của mình trong lớp PHP được tạo trực tiếp. Tôi đã chỉnh sửa câu trả lời của mình để làm nổi bật thực tế này. – Matt

2

Bạn có thể thử thêm giá trị DEFAULT với columnDefinition, nhưng nó là DDL và nó phụ thuộc vào DBMS cụ thể (điều xấu). Theo gương của bạn, lĩnh vực * is_visible * sử dụng MySQL:

is_visible: 
    type: bool 
    columnDefinition: is_visible tinyint(1) NOT NULL DEFAULT '1' 

Nói chung, đây là không phải là một ý tưởng tốt và bạn được khuyến khích sử dụng phương pháp xây dựng hoặc khởi tạo tài sản bằng mã trong các lớp thực thể ..

11

Bạn có thể thêm giá trị mặc định cho cột bằng cách sử dụng thuộc tính tùy chọn trong chú thích hoặc yaml. Bạn có thể đọc thêm tại doctrine annotation documentation.

Ví dụ về chú thích:

/** 
* @ORM\Column(type="bool", name="is_visible", options={"default": false}) 
*/ 
protected $isVisible; 

Ví dụ cho YAML:

isVisible: 
    type: boolean 
    column: is_visible 
    options: 
     default: false 
+0

Cảm ơn, điều này giống như câu trả lời hợp lệ duy nhất nếu bạn quan tâm đến việc di chuyển cơ sở dữ liệu khi thêm cột mới có giá trị mặc định phải được đặt cho tất cả các đối tượng hiện có. Thiết lập giá trị trong PHP sẽ chỉ làm việc cho các đối tượng mới. – youen

1

Hiện đã trôi qua. Bây giờ bạn có thể đặt giá trị mặc định cho một cột thông qua yaml.

columnName: 
    type: string 
    options: 
      default: "someText"