2012-01-31 28 views
12

Cách dễ nhất để tạo ra nextval cho một số chuỗi cụ thể có tên đã cho là gì?Tạo giá trị chuỗi tiếp theo theo cách thủ công trong Doctrine 2

Giải pháp chú thích với định

* @ORM\GeneratedValue(strategy="SEQUENCE") 
* @ORM\SequenceGenerator(sequenceName="sq_foobar", allocationSize="1", initialValue="1") 

không đáp ứng với tôi, miễn là có một số logic phức tạp hơn liên quan đến: trong một số trường hợp tôi cần phải lấy nextval, trong khác - tôi sẽ đi với giá trị được lấy từ một nguồn khác (không phải chuỗi).

Vì vậy, tôi hy vọng có một cách để truy xuất chuỗi tiếp theo theo cách thủ công trong hàm tạo của đối tượng.

Trả lời

4

Sau đó, tôi nghĩ bạn nên triển khai Trình tạo mã định danh của riêng bạn.

Cách đơn giản nhất là ghi đè lớp Doctrine \ ORM \ Id \ SequenceGenerator để xử lý trường hợp cụ thể của bạn.

Sau đó, bạn phải đăng ký trình tạo này trong siêu dữ liệu lớp bằng cách sử dụng API Doctrine ORM.

Một số liên kết: http://ranskills.wordpress.com/2011/05/26/how-to-add-a-custom-id-generation-strategy-to-doctrine-2-1/

https://github.com/doctrine/doctrine2/pull/206

+4

Bài viết đề xuất sửa đổi các tệp lõi: -S – zerkms

+0

Đúng. Không thể sửa đổi các tập tin học thuyết cốt lõi, cho đến khi PR # 206 được sát nhập. – Florian

+0

Bạn có thể duy trì ngã ba của riêng mình, ngay cả khi đó không phải là ý tưởng hay.Nhưng một ý tưởng thậm chí còn tồi tệ hơn là kết hợp việc tạo mã định danh. – Florian

16

Có hai khả năng nhận được chuỗi NEXTVAL trong Doctrine2:

  1. Sử dụng Học thuyết ORM SequenceGenerator

    use Doctrine\ORM\Id\SequenceGenerator; 
    $sequenceName = 'file_id_seq'; 
    $sequenceGenerator = new SequenceGenerator($sequenceName, 1); 
    $newId = $sequenceGenerator->generate($entityManager, $entity); 
    // $entity in this case is actually not used in generate() method, so you can give any empty object, or if you are not worried about editor/IDE warnings, you can also specify null 
    
  2. Sử dụng SQL mẹ đẻ

    $sequenceName = 'file_id_seq'; 
    $dbConnection = $entityManager->getConnection(); 
    $nextvalQuery = $dbConnection->getDatabasePlatform()->getSequenceNextValSQL($sequenceName); 
    // $nextvalQuery is now following string "SELECT NEXTVAL('file_id_seq')" 
    $newId = (int)$dbConnection->fetchColumn($nextvalQuery); 
    
+0

Tôi không nhớ bây giờ - nhưng vì một số lý do giải pháp rõ ràng như vậy không phù hợp với yêu cầu của tôi, nhưng đã quá lâu rồi, vì vậy +1 cho bạn thời gian ;-) – zerkms

+0

cho các cột không phải pk chỉ biến thể thứ hai là giải pháp – timaschew

+0

Nếu bạn sử dụng allocSize> 1, ví dụ: allocSize = "100", giải pháp thứ hai sẽ không hoạt động chính xác, vì nó sẽ nhảy 100 giá trị mỗi lần. – ChocoDeveloper

36

Chỉ trong những vùng đất khác trường hợp ai đó về vấn đề này (như tôi đã làm):
Yêu cầu kéo @Florian đề cập đã làm cho nó vào học thuyết bây giờ. Mặc dù tài liệu dường như vẫn thiếu bất kỳ thông tin nào cho chiến lược máy phát điện id CUSTOM id. Chỉ một phần tôi đã tìm thấy nơi có tùy chọn CUSTOM cho IdGenerator được mô tả ở số GeneratedValue mô tả. Nếu tôi bỏ lỡ nó, hãy sửa tôi trong phần bình luận.

Khó khăn có thể dễ dàng được triển khai. Chỉ cần tạo một lớp mở rộng Doctrine\ORM\Id\AbstractIdGenerator\AbstractIdGenerator:

namespace My\Namespace; 
use Doctrine\ORM\Id\AbstractIdGenerator; 
class MyIdGenerator extends AbstractIdGenerator 
{ 
    public function generate(\Doctrine\ORM\EntityManager $em, $entity) 
    { 
     // Create id here 
     $id = <do some logic>; 
     return $id; 
    } 
} 

Sau đó thêm nó vào id mô tả của bạn trong cấu hình học thuyết thực thể (YAML ví dụ):

My\Bundle\Entity\MyEntity: 
    type: entity 
    id: 
     id: 
      type: bigint 
      unique: true 
      generator: 
       strategy: CUSTOM 
      customIdGenerator: 
       class: 'My\Namespace\MyIdGenerator' 
    fields: 
     otherField: .... 

Nếu bạn sử dụng Annotations thay vì YAML, cấu hình đơn vị nên trông như thế này (chưa được kiểm tra):

/** 
    * @Id 
    * @Column(type="integer") 
    * @GeneratedValue(strategy="CUSTOM") 
    * @CustomIdGenerator(class="My\Namespace\MyIdGenerator") 
    */ 
    public $id; 

Và đó là tất cả;)

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