原则使用联接表在一对多单向中查询一个实体



我有两个实体通过一对多单向连接表关联链接。

use DoctrineORMMapping as ORM;
/**
* @Entity(repositoryClass="FooRepository")
*/
class Foo
{
/**
* @var Collection
* @ORMManyToMany(targetEntity="Bar")
* @ORMJoinTable(
*      name="foo_bar",
*      inverseJoinColumns={@ORMJoinColumn(unique=true)}
* )
*/
private $bars;
/**
* @var int
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
// [...]
}
/**
* @Entity(repositoryClass="BarRepository")
*/
class Bar
{
/**
* @var int
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
// [...]
}

我想使用 foo id 和 bar id 在我的BarRepository类中创建一种方法,该方法返回一个或空Bar对象。

实际上我的类看起来像这样:

use DoctrineORMEntityRepository;
class BarRepository extends EntityRepository
{
/**
* Finds a single bar.
* @param int $fooId The foo identifier.
* @param int $barId The bar identifier.
* @return Bar|null
*/
public function findOneByFoo($fooId, $barId)
{
$qb = $this->createQueryBuilder('b');
$qb->innerJoin('Foo', 'f', ExprJoin::WITH, 'f.id = :fooId')
->where('b.id = :barId')
->setParameter('fooId', $fooId)
->setParameter('barId', $barId)
->getQuery()->getOneOrNullResult();
}
}

但这总是返回一个柱线对象,即使柱线 id 没有与 foo 对象关联。

好的,感谢 staskrak,我像这样重写我的"查询",它工作正常。FooBar实体是相同的。 我保留了相同的查询基础,但在Foo->bars属性和Bar实体之间添加了内部联接。

use DoctrineORMEntityRepository;
class BarRepository extends EntityRepository
{
public function findOneByFoo($fooId, $barId)
{
$parameters = [
':fooId' => $fooId,
':barId' => $barId
];
$qb = $this->createQueryBuilder('b');
return $qb
->innerJoin('Foo',    'f',  'WITH', 'f.id = :fooId')
// below, the added inner join
// it makes the link between the Foo->bars property and the Bar entity
->innerJoin('f.bars', 'fb', 'WITH', 'b.id = fb.id')
->where('b.id = :barId')
->setParameters($parameters)
->getQuery()
->getOneOrNullResult();
}
}
  1. 首先! 这不是必需的,但我建议你总是写 批注中的完整映射。

    让我们看看你的实体。我们可以对您的下一个断言 一对多:

    一个 Foo 对象可以有多个 Bar 对象,但每个 Bar 对象都引用 只有一个,没有更多的 Foo 对象。 例如,一个人可以有很多信用卡,但每个信用 卡属于一个人。

因此,我们可以写下:

/**
* @Entity(repositoryClass="FooRepository")
*/
class Foo
{
/**
* Unidirectional One-To-Many
* One Foo has many Bar, however Bar has only one Foo
* 
* @ORMManyToMany(targetEntity="Bar")
* @ORMJoinTable(
*      name="foo_bar_table",
*      joinColumns={@JoinColumn(name="foo_id", referencedColumnName="id")},
*      inverseJoinColumns={@JoinColumn(name="bar_id", referencedColumnName="id", unique=true)
*/
private $bars;
/**
* Foo constructor
*/
public function __construct()
{
$this->bars = new DoctrineCommonCollectionsArrayCollection();
}
    当然,你
  1. 总是会有一个带有你键入的 id 的柱线对象。 为什么?让我们看看你的关系(表格(。 Foo - 这是一个表,它有字段
    id.Bar - 这是一个表,它有字段 id。 foo_bar_table - 此表有foo_id,bar_id。

    当您进行连接时 - 您只需将另一个表添加到一个表中。 这些表彼此之间没有关联。所以你想要 酒吧对象 - 你明白了。
    您需要从 Bar 存储库中获取 Bar 对象。这将是 更好。

相关内容

  • 没有找到相关文章

最新更新