我的sonata-admin设置中有两个表与Symfony2:'product'
和'product_description'
。第二个包含多种语言的产品描述,并将product_id和language_id列定义为复合主键。在产品表中没有language_id
列,因此应根据客户选择的语言将其与描述动态连接。
我目前正在尝试通过OneToOne
和JoinColumns
注释加入他们,但product_description
如何将language_id
作为静态值加入({1}}哪个不作为产品表中的列出现?)
/**
* ProductDescription
*
* @ORM\Table(name="product_description")
* @ORM\Entity
*/
class ProductDescription
{
/**
* @var integer
*
* @ORM\Column(name="product_id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $productId;
/*
* @var boolean
*
* @ORM\Column(name="language_id", type="boolean")
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $languageId;
....
}
/**
* Product
*
* @ORM\Table(name="product")
* @ORM\Entity
*/
class Product
{
/**
* @var integer
*
* @ORM\Column(name="product_id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $productId;
/**
* @ORM\OneToOne(targetEntity="ProductDescription")
* @ORM\JoinColumns({
* @JoinColumn(name="product_id", referencedColumnName="product_id"),
* @JoinColumn(name="??????", referencedColumnName="language_id")
* })
*/
private $productDescription;
....
}
编辑:添加更多代码
// admin class
protected function configureListFields(ListMapper $listMapper)
{
$listMapper->addIdentifier('productId', 'integer')
->addIdentifier('productDescription.productName');
}
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper->add('offersId', 'integer', array('read_only' => true))
->add('productDescription.productName');
}
我尝试在createQuery()方法中使用queryBuilder手动加入它,但是会在列表视图中给出奇怪的结果。
public function createQuery($context = 'list')
{
$query = parent::createQuery($context);
$query->addSelect('p')->innerJoin('AppBundle\Entity\ProductDescription', 'p', 'WITH', $query->getRootAlias().'.productId = p.productId and p.languageId = 2');
return $query;
}
编辑:这是Hibernate中的一个类似问题 - 也许可以转化为学说?
答案 0 :(得分:0)
据我所知,您的模型中不存在“语言”,因此您无法与任何人建立关系。你可以做的只是创建一个字符串或整数列类型,并保持你的语言值:
/**
* @ORM\Column(type="string")
* @var string
*/
private $languageId
您可以使用会话区域设置或在模型中使用某些常量并进行有效ID的验证:
const LANGUAGE_ID_EN = 'en';
const LANGUAGE_ID_FR = 'fr';
public function setLanguageId($languageId)
{
if ( ! in_array($$languageId, [...]) {
throw new \Exception(...);
}
$this->languageId = $languageId;
}
然后您只需使用其他WHERE子句进行查询:
WHERE language_id = ?
我希望我帮到你。如果您的目标不同,请告诉我们。