2016-09-08 11 views
0

マルチセレクションのオプション/選択肢をデータベースのフィールドに結合しようとしています。すでにSymfony自身でサポートされていますか?Symfonyエンティティブールフィールドにバインドされた選択肢を選択します。

関連エンティティのフィールド:

/** 
* @ORM\Column(type="boolean", nullable=true) 
*/ 
private $isSpellchecked; 

/** 
* @ORM\Column(type="boolean", nullable=true) 
*/ 
private $isCompleted; 

/** 
* @ORM\Column(type="boolean", nullable=true) 
*/ 
private $isEmailed; 

HTMLの例:もちろん

<select multiple> 
    <option value="isSpellchecked">Spellchecked</option> 
    <option value="isCompleted">Completed</option> 
    <option value="isEmailed">Emailed</option> 
</select> 

私は選択のフロントエンドの実装のためのBootstrap Multipleを使用することになります。 質問は、コントローラで手作業で行うのではなく、オプションをフィールドに配線する方法です。

私はいくつかのポイントを逃していますか?

答えて

1

私の意見では、あなたのエンティティには1つの属性だけをマッピングする必要があります。

/** 
* @var array 
* 
* @ORM\Column(type="array", nullable=true) 
*/ 
private $myChoices; 

... 

public function __construct() 
{ 
    $this->myChoices = []; 
} 

/** 
* @return array 
*/ 
public function getMyChoices() 
{ 
    return array_unique($this->myChoices); 
} 

/** 
* @param array $myChoices 
*/ 
public function setMyChoices(array $myChoices) 
{ 
    $this->myChoices = []; 

    foreach ($myChoices as $myChoice) { 
     $this->addMyChoice($myChoice); 
    } 

    return $this; 
} 

/** 
* @param string $myChoice 
*/ 
public function addMyChoice($myChoice) 
{ 
    if (!$this->hasMyChoice($myChoice)) { 
     $this->myChoices[] = $myChoice; 
    } 

    return $this; 
} 

/** 
* @param string $myChoice 
* 
* @return bool 
*/ 
public function hasMyChoice($myChoice) 
{ 
    return in_array($myChoice, $this->myChoices, true); 
} 

そして、あなたにformTypeで、古典ん:

->add('myChoices', ChoiceType::class, [ 
    'choices' => [ 
     'Spellchecked', 
     'Completed', 
     'Emailed', 
    ], 
    'expanded' => true, 
    'multiple' => true, 
]) 

はその後、あなたの選択は、このように、配列としてデータベースに保存されています

mychoices field = a:2:{i:0;s:12:"Spellchecked";i:1;s:7:"Emailed";} 
// which is like ['Spellchecked', 'Emailed'] 

そして、あなたのようなデータを取得することができますこれは:

$isSpellchecked = $MyEntity->hasMyChoice('Spellchecked'); // return true 
$isCompleted = $MyEntity->hasMyChoice('Completed'); // return false 
+0

ありがとうございました。あなたのソリューションでは、選択肢がデータベースフィールドに変換されますか?また、エンティティで 'getIsEmailed()'を実行することは可能ですか? – DelphiLynx

+0

申し訳ありませんが、あなたのフィールドは「複数」である必要があります。この場合、私の反応は本当に正確ではありません。あなたのニーズに合わせて編集します。 –

+0

私は私の答えを編集しました、それを読むことを自由に感じてください –

関連する問題