2016-06-13 35 views
0

我有两个表在我的sonata-admin设置与Symfony2:'product''product_description'。第二个包含几种语言产品的描述,并将product_id和language_id列定义为复合主键。在产品表中没有language_id列,因此根据客户选择的语言,它应该与描述动态结合。JoinColumns列和静态值

目前我正在试图通过一个OneToOneJoinColumns注释的帮助加入其中,但是如何才能product_descriptionlanguage_id加入成为一个静态值(这是不存在的产品表中的列)?

/** 
* 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'); 
} 

我试图用手工的QueryBuilder参与进来,但是的createQuery()方法会给列表视图奇怪的结果。

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; 
} 

编辑:这里是一个类似的问题在休眠 - 也许可以转化为教条?

https://forum.hibernate.org/viewtopic.php?f=1&t=986966

+0

你有任何代码可以告诉我们吗? –

+0

添加了代码,如何在product_id上连接这两个表以及为language_id指定一个静态值,例如2. – Chris

回答

0

据我了解,没有“语言”存在于你的模型,这样你就不能创建关系的任何。你可以做的是只创建一个字符串或整列类型,只是保持你的语言值是:

/** 
    * @ORM\Column(type="string") 
    * @var string 
    */ 
private $languageId 

您可以使用您的会议场所或在你的模型的一些常数与有效身份证件的一些验证:

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 = ? 

我希望我有你的权利。让我们知道你的目标是不同的。

+0

是的,您正确理解我,但是我使用的sonata-admin不提供声明自己的SQL语句的可能性。所以我正在寻找只有JoinColumns注解的解决方案。 – Chris

+0

请指出您要使用连接的情况。你需要哪种控制器/方法/案例这种关系?那么想想解决方案会更容易。 Sonata Admin与许多其他软件包或“优秀架构”组件允许注入自定义事物一样,因为方法可能会有所不同,所以我们只需要了解在何处执行此操作。 PS。 Join是一个模型关系,所以不可能有这样的解决方案。了解更多关于数据库和学说的信息,以了解您的意愿的不可能性。 ;) – lllypa

+0

我非常喜欢数据库,但是symfony以及doctrine对我来说是相当新的;)我根本无法理解为什么在JoinColumn注释中没有可能只使用静态值。始终必须在两个数据库实体中提供现有列的原因是什么?对于我的用例,这不太方便!正如你似乎已经理解我的问题,你能举一个例子说明这种情况将如何在一个奏鸣曲管理环境中处理?我只需要一个示例如何做,不需要适应所有的我的控制器/方法等。 – Chris