2016-09-12 8 views
2

Symfonyエンティティ内でmySQL's generated columnを使用するのは正しいですか?例えばDoctrineはMySQLの生成カラムを定義できますか?

、以下の例のGENERATED ALWAYS:?私はこれが実体__construct()に行うことができるが、それは教義/ MySQLので扱わ持つことがより正確だろう理解

CREATE TABLE contacts (
    id INT AUTO_INCREMENT PRIMARY KEY, 
    first_name VARCHAR(50) NOT NULL, 
    last_name VARCHAR(50) NOT NULL, 
    fullname varchar(101) GENERATED ALWAYS AS (concat(first_name,' ',last_name)), 
    email VARCHAR(100) NOT NULL 
); 

ような何か:

/** 
* @ORM\Column(type="text") 
* @ORM\Generated(concat(first_name,' ',last_name)) 
*/ 
private $fullname; 

答えて

0

私はそれだけで

/** 
* @ORM\Column(name="fullname", type="text") 
*/ 
private $fullname; 

データはいつもの列からとして読み込まれるのです信じています。しかし、このフィールドを編集することを許可しないでください(セッターを作成しないでください)。

0

マッピングはDoctrineのエンティティに列を生成することは可能ですが、それはいくつかの制限が付属しています:Doctrineが生成された列に挿入しようとしますので、

  • あなたは、新しいエンティティを永続化することはできません、それは、その結果エラー。
  • スキーマツール(orm:schema-tool:update --dump-sql)は、常に列を変更する必要があると考えます。

一つの可能​​な回避策は昔のようにトリガーを使用することです:

CREATE TABLE contacts (
    id INT AUTO_INCREMENT PRIMARY KEY, 
    first_name VARCHAR(50) NOT NULL, 
    last_name VARCHAR(50) NOT NULL, 
    fullname varchar(101) NOT NULL, 
    email VARCHAR(100) NOT NULL 
); 

CREATE TRIGGER contacts_before_insert BEFORE INSERT ON contacts 
FOR EACH ROW BEGIN 
    SET NEW.fullname = (CONCAT(NEW.first_name, ' ', NEW.last_name)); 
END; 

CREATE TRIGGER contacts_before_update BEFORE UPDATE ON contacts 
FOR EACH ROW BEGIN 
    SET NEW.fullname = (CONCAT(NEW.first_name, ' ', NEW.last_name)); 
END; 

他の可能な回避策は、エンティティへの更新ロジックを移動されますが、それはに直接実行された変更が反映されませんデータベース。

関連する問題