Page我在和之間有 OneToOne 關系SuperGridContent:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="page")
* @ORM\HasLifecycleCallbacks
*/
class Page
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
//...
/**
* @ORM\OneToOne(targetEntity="AppBundle\Entity\SuperGridContent", mappedBy="page", cascade={"persist", "remove"})
*/
protected $super_grid;
//...
}
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="super_grid_content")
* @ORM\HasLifecycleCallbacks
*/
class SuperGridContent
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="AppBundle\Entity\Page", inversedBy="super_grid")
*/
private $page;
//...
}
然后在頁面管理類中我有:
<?php
namespace AppBundle\Admin;
use AppBundle\Entity\Page;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Form\Type\ModelType;
class PageAdmin extends AbstractAdmin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('super_grid', ModelType::class, [
'label' => 'Super Grid',
'required' => false,
])
// ...
;
}
// ...
}
問題是,當我創建或編輯 aPage時,該super_grid欄位是一個 select 標記,其中所有現有選項都SuperGridContent作為選項。即使他們已經有Page關系。如果我選擇其中之一,當然它會失敗,因為這種關系應該是唯一的。
我錯過了什么還是有辦法奏鳴曲可以處理它?
我正在使用 SonataAdminBundle 3.4
uj5u.com熱心網友回復:
如果我正確理解您的問題,我認為您可以使用 Symfony 物體型別而不是 Sonata檔案中所述的模型型別。
但我也認為,如果你顛倒 OneToOne 關系的所有權,你的生活會容易得多。在您的示例SuperGridContent中,擁有關系,因此當您想要更新super_grida 時,Page您可能會遇到約束違規。如果您更改inversedBy為mappedBy在SuperGridContent課堂上和mappedBy課堂inversedBy中Page( 如果您重新生成表并確保級聯邏輯符合您的需求),您應該沒問題。
如果我理解得很好,您希望任何 newPage都只有 available super_grids 作為選擇,而任何現有Page的都將其當前super_grid all the available super_grids 作為選擇。
然后類似下面的東西就可以完成這項作業(注意我使用的是 Symfony 4.4,您的實作可能存在細微的語法差異):
namespace App\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Form\FormMapper;
//use Sonata\AdminBundle\Form\Type\ModelType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;
use App\Entity\Page;
use App\Entity\SuperGridContent;
final class PageAdmin extends AbstractAdmin
{
protected function configureFormFields(FormMapper $form): void
{
$subject = $this->getSubject();
if($subject->getId()){
$form
->add('super_grid', EntityType::class, [
'class' => SuperGridContent::class,
'query_builder' => function (EntityRepository $er) use($subject) {
return $er->createQueryBuilder('s')
->leftjoin('s.page', 'p')
->where('p.super_grid is null')
->orWhere('p = :my_page')
->setParameter('my_page', $subject)
;
},
]);
}
else{
$form
->add('super_grid', EntityType::class, [
'class' => SuperGridContent::class,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('s')
->leftjoin('s.page', 'p')
->where('p.super_grid is null')
;
},
]);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/448597.html
標籤:php 交响乐 奏鸣曲管理员 symfony-3.4
