JoinColumns 在列和静态值上
Posted
技术标签:
【中文标题】JoinColumns 在列和静态值上【英文标题】:JoinColumns on column and static value 【发布时间】:2016-10-14 09:09:52 【问题描述】:我在使用 Symfony2 的奏鸣曲管理员设置中有两个表:'product'
和 'product_description'
。第二个包含多种语言的产品描述,并将 product_id 和 language_id 列定义为复合主键。在产品表中没有language_id
列,因此它应该根据客户选择的语言与描述动态连接。
我目前正在尝试借助 OneToOne
和 JoinColumns
注释加入它们,但是如何将 product_description
与 language_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');
我尝试在 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 中的一个类似问题 - 也许可以转移到教义?
https://forum.hibernate.org/viewtopic.php?f=1&t=986966
【问题讨论】:
你有什么代码可以给我们看吗? 添加了代码,如何在 product_id 和 language_id 的静态值上连接这两个表,比如 2。 【参考方案1】:据我了解,您的模型中不存在“语言”,因此您无法创建与任何“语言”的关系。您可以做的只是创建一个字符串或整数列类型,并在其中保留您的语言值:
/**
* @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 = ?
希望我没听错。如果您的目标有所不同,请告诉我们。
【讨论】:
是的,您正确理解了我的意思,但是我使用的是 Sonata-admin,它无法声明自己的 SQL 语句。所以我正在寻找一个只有 JoinColumns 注释的解决方案。 请指定您要使用join的情况。您究竟需要哪种控制器/方法/案例?那么就更容易想出解决方案了。 Sonata Admin,由于许多其他捆绑包或“良好架构”组件允许注入自定义内容,我们只需要了解在哪里执行它,因为方法可能会有所不同。 PS。而 Join 是一个模型关系,所以不能有这样的解决方案。了解更多关于数据库和 Doctrine 的信息,以了解您的意愿是不可能的。 ;) 我非常喜欢数据库,但是 symfony 和学说对我来说都是新事物;)我简直无法理解为什么不可能在 JoinColumn 注释中只使用静态值。总是必须在两个数据库实体中提供现有列的原因是什么?对于我的用例,这不是很方便!而且您似乎已经理解了我的问题,您能否举例说明如何在奏鸣曲管理环境中处理这种情况?我只需要一个示例,无需将所有内容都调整为我的控制器/方法等。 好的,让我们有建设性。 1. 正如我之前提到的,提供在奏鸣曲中需要这样加入的情况。是在管理课上吗?它在列表/编辑视图中吗?是渲染字段吗?您究竟需要什么以及在哪里使用这样的连接进行查询? 2. 如果我说对了,我已经给了你最好的解决方案。你没有提供任何论据,为什么这个解决方案不适合你。 3. 如果你问,为什么不能连接到某个静态值,我敢打赌,你并不真正了解数据库和关系是如何工作的,所以尝试阅读一些关于“数据库关系”的基础知识,我猜? ! 附言。这是堆栈溢出。您有问题,我们正在努力帮助您。请更加尊重并帮助我们帮助您。更具体,提供代码,描述案例/情况(以及代码示例)等。这样我们可以更好更快地帮助您。并且没有这种毫无意义/几乎是个人的聊天。以上是关于JoinColumns 在列和静态值上的主要内容,如果未能解决你的问题,请参考以下文章