Symfony2 Doctrine2使用具有第二关系的条件获取结果

时间:2018-12-02 12:20:23

标签: symfony doctrine-orm

我想问问有没有简单的方法来获取具有第二关系条件的数据。

在我的控制器中,我得到了每个类别实体。

每个类别都有很多产品,因此有一个“ OneToMany”关系。 接下来,每个产品都有一个作者,并且关系为“ ManyToOne”。

现在,我想获取包含有效产品和有效作者产品的每个类别。

类别一对多产品 产品ManyToOne作者 产品具有“活动”字段 作者的字段为“活动”

我在商品类别实体中获取产品的方法。

<ResourceDictionary>
<Style TargetType="CalendarItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="CalendarItem">

                    <Grid x:Name="PART_Root">
                                    <Grid
                                        Name="PART_DAYS"

                                        Visibility="Visible">
                                        <Label
                                            Grid.Row="0"
                                            Grid.Column="0"
                                            Content="{Binding DaysOfWeekNames[0]}"
                                            Style="{StaticResource BaseStyle}" />
                                        <Label
                                            Grid.Row="0"
                                            Grid.Column="1"
                                            Content="{Binding DaysOfWeekNames[1]}"
                                            Style="{StaticResource BaseStyle}" />
                                        <Label
                                            Grid.Row="0"
                                            Grid.Column="2"
                                            Content="{Binding DaysOfWeekNames[2]}"
                                            Style="{StaticResource BaseStyle}" />
                                        <Label
                                            Grid.Row="0"
                                            Grid.Column="3"
                                            Content="{Binding DaysOfWeekNames[3]}"
                                            Style="{StaticResource BaseStyle}" />
                                        <Label
                                            Grid.Row="0"
                                            Grid.Column="4"
                                            Content="{Binding DaysOfWeekNames[4]}"
                                            Style="{StaticResource BaseStyle}" />
                                        <Label
                                            Grid.Row="0"
                                            Grid.Column="5"
                                            Content="{Binding DaysOfWeekNames[5]}"
                                            Style="{StaticResource BaseStyle}" />
                                        <Label
                                            Grid.Row="0"
                                            Grid.Column="6"
                                            Content="{Binding DaysOfWeekNames[6]}"
                                            Style="{StaticResource BaseStyle}" />

                                        <CalendarDayButton
                                            Grid.Row="1"
                                            Grid.Column="0"
                                            Content="{Binding Days[0]}"
                                            Style="{DynamicResource CalendarDayButtonStyle}" />
                                        <CalendarDayButton
                                            Grid.Row="1"
                                            Grid.Column="1"
                                            Content="{Binding Days[1]}"
                                            Style="{DynamicResource CalendarDayButtonStyle}" />
                                        <CalendarDayButton
                                            Grid.Row="1"
                                            Grid.Column="2"
                                            Content="{Binding Days[2]}"
                                            Style="{DynamicResource CalendarDayButtonStyle}" />
                                        <CalendarDayButton
                                            Grid.Row="1"
                                            Grid.Column="3"
                                            Content="{Binding Days[3]}"
                                            Style="{DynamicResource CalendarDayButtonStyle}" />
                                        <CalendarDayButton
                                            Grid.Row="1"
                                            Grid.Column="4"
                                            Content="{Binding Days[4]}"
                                            Style="{DynamicResource CalendarDayButtonStyle}" />
                                        <CalendarDayButton
                                            Grid.Row="1"
                                            Grid.Column="5"
                                            Content="{Binding Days[5]}"
                                            Style="{DynamicResource CalendarDayButtonStyle}" />

                                    </Grid>
                                </Grid>                                            
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

1 个答案:

答案 0 :(得分:0)

当您致电getProducts()时,Doctrine将从数据库中获取所有条目并选择符合您条件的产品。虽然目前可以使用,但最好使用数据库(MySQL?)选择正确的条目。

因此,请改用QueryBuilder。并且由于您是Symfony,所以可以在Repository中创建这些方法。

我们不是在这里编写您的代码,而是要给您一个想法,它可能是这样的:

  

CategoryRepository.php

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Query\Expr\Join;

class CategoryRepository extends ServiceEntityRepository
{
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, Category::class);
    }

    public function findActiveCategories()
    {
        $qb = $this->createQueryBuilder('Category')
            ->innerJoin(
                'AppBundle:Product',
                'Product',
                Join::WITH,
                'Category.id = Product.category'
            )
            ->where('Product.isActive = 1')
        ;

        return $qb->getQuery()->getResult();
    }
}