【发布时间】:2015-10-22 18:57:44
【问题描述】:
我有一个基于 Sonata Admin Bundle 开发的仪表板,但我遇到了问题。这就是 configureFormFields(FormMapper $formMapper) 方法在 CompanyAdmin 管理控制器中的样子:
protected function configureFormFields(FormMapper $formMapper)
{
$image = $this->getSubject();
$fileFieldOptions = array('required' => false, 'label' => 'Logo');
if ($image && ($webPath = $image->getLogoUrl())) {
$fileFieldOptions['help'] = '<img src="'.$webPath.'" class="admin-preview img-rounded img-responsive"/>';
}
$em = $this->modelManager->getEntityManager('PDI\PDOneBundle\Entity\Brand');
$query = $em->createQueryBuilder('b')
->select('b')
->from('PDOneBundle:Brand', 'b')
->where('b.company IS NULL');
$formMapper
->with('Information', array('class' => 'col-md-6'))
->add('name')
->add('division')
->add('inactive')
->add(
'brands',
'sonata_type_model',
array(
'multiple' => true,
'by_reference' => false,
'query' => $query,
)
)
->end()
->with('Logo', array('class' => 'col-md-6'))
->add('file', 'file', $fileFieldOptions)
->end();
}
这里的问题是当我将brands 分配给company 并在我没有看到品牌字段填写后尝试编辑公司时,为什么?我在这里缺少什么?我能得到一些帮助吗?
以下是带有图像的示例。请注意,当我编辑公司时,我看不到品牌,但当我编辑品牌时,我可以看到公司:
更新
如 Profiler 所示,这是为在编辑表单上获取结果而执行的查询:
SELECT
t0. NAME AS name_1,
t0.generic_name AS generic_name_2,
t0.logo_url AS logo_url_3,
t0.description AS description_4,
t0.isi_required AS isi_required_5,
t0.isi_text AS isi_text_6,
t0.isi_pdf_url AS isi_pdf_url_7,
t0.pi_required AS pi_required_8,
t0.pi_text AS pi_text_9,
t0.pi_pdf_url AS pi_pdf_url_10,
t0.inactive AS inactive_11,
t0.template_name AS template_name_12,
t0.id AS id_13,
t0.createdAt AS createdAt_14,
t0.updatedAt AS updatedAt_15,
t0.companies_id AS companies_id_16
FROM
brands t0
WHERE
t0.companies_id = 2
这是来自 DB 的查询的输出:
+------------+----------------+------------------------------------------------------------+---------------+----------------+------------+---------------+---------------+-----------+---------------+-------------+------------------+-------+---------------------+---------------------+-----------------+
| name_1 | generic_name_2 | logo_url_3 | description_4 | isi_required_5 | isi_text_6 | isi_pdf_url_7 | pi_required_8 | pi_text_9 | pi_pdf_url_10 | inactive_11 | template_name_12 | id_13 | createdAt_14 | updatedAt_15 | companies_id_16 |
+------------+----------------+------------------------------------------------------------+---------------+----------------+------------+---------------+---------------+-----------+---------------+-------------+------------------+-------+---------------------+---------------------+-----------------+
| Brand Test | | https://someurl.com/no_image_available.png | | 0 | NULL | NULL | 0 | NULL | NULL | 0 | NULL | 2 | 2015-10-22 10:45:14 | 2015-10-26 08:04:53 | 2 |
+------------+----------------+------------------------------------------------------------+---------------+----------------+------------+---------------+---------------+-----------+---------------+-------------+------------------+-------+---------------------+---------------------+-----------------+
那么当前公司(我正在编辑的记录)和品牌之间存在关系,为什么没有显示在编辑表单上?
更新:实体
以下是Company 和Brands 的实体定义:
/**
* @ORM\Entity
* @ORM\Table(name="companies", options={"collate"="utf8_general_ci"})
* @ORM\HasLifecycleCallbacks()
*/
class Company
{
use IdentifierAutogeneratedTrait;
use TimestampableEntity;
use UploadTrait;
/**
* @var string
* @ORM\Column(type="string", length=45)
* @Assert\NotBlank()
*/
protected $name;
/**
* @var string
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected $logo_url = 'https://someurl.com/no_image_available.png';
/**
* @var string
* @ORM\Column(type="string", length=45, nullable=true)
*/
protected $division;
/**
* @var bool
* @ORM\Column(type="boolean")
*/
protected $inactive = false;
/**
* @var Brand
* @ORM\OneToMany(targetEntity="Brand", mappedBy="company", cascade={"persist"})
**/
protected $brands;
public function __construct()
{
$this->brands = new ArrayCollection();
}
...
}
/**
* @ORM\Entity
* @ORM\Table(name="brands")
* @ORM\Entity(repositoryClass="PDI\PDOneBundle\Entity\Repository\BrandRepository")
* @ORM\HasLifecycleCallbacks()
*/
class Brand
{
use IdentifierAutogeneratedTrait;
use TimestampableEntity;
use UploadTrait;
/**
* @var string
* @ORM\Column(type="string", length=45)
* @Assert\NotBlank()
*/
protected $name;
/**
* @var string
* @ORM\Column(type="string", length=45)
* @Assert\NotBlank()
*/
protected $generic_name;
/**
* @var string
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected $logo_url = 'https://someurl.com/no_image_available.png';
/**
* @var string
* @ORM\Column(type="text")
* @Assert\NotBlank()
*/
protected $description;
/**
* @var bool
* @ORM\Column(type="boolean", nullable=true)
*/
protected $isi_required;
/**
* @var string
* @ORM\Column(type="text", nullable=true)
*/
protected $isi_text;
/**
* @var string
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected $isi_pdf_url;
/**
* @var bool
* @ORM\Column(type="boolean", nullable=true)
*/
protected $pi_required;
/**
* @var string
* @ORM\Column(type="text", nullable=true)
*/
protected $pi_text;
/**
* @var string
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected $pi_pdf_url;
/**
* @var bool
* @ORM\Column(type="boolean")
*/
protected $inactive = false;
/**
* @var string
* @ORM\Column(type="string", length=45, nullable=true)
*/
protected $template_name;
/**
* @var Company
* @ORM\ManyToOne(targetEntity="Company", inversedBy="brands")
* @ORM\JoinColumn(name="companies_id", referencedColumnName="id", nullable=true)
*/
protected $company;
/**
* @ORM\OneToMany(targetEntity="TargetBrand" , mappedBy="brand", cascade={"persist"}, orphanRemoval=true)
* */
protected $targetBrand;
/**
* @ORM\OneToMany(targetEntity="TerritoryBrand" , mappedBy="brand", cascade={"persist"}, orphanRemoval=true)
* */
protected $territoryBrand;
public function __construct()
{
$this->targetBrand = new ArrayCollection();
$this->territoryBrand = new ArrayCollection();
}
...
}
【问题讨论】:
-
我假设您的品牌在 Db 中没有公司。当您在 Web 调试栏中检查查询时,查询是否有结果?
-
@11mb 当然,公司和品牌之间存在关系,请参阅主帖上的编辑。
-
你能用实体关系更新你的问题吗?我真的在考虑不良的实体关系。如果您使用 Doctrine,这是一个很好的指南 krueckeberg.org/notes/d2.html
-
@Cassiano 完成,我添加了两个实体
标签: php symfony sonata-admin symfony-sonata sonata