【问题标题】:Define custom method and access it from twig定义自定义方法并从 twig 访问它
【发布时间】:2013-05-12 15:15:00
【问题描述】:

我在 1:n 关系中有两个实体:Race 和 Day - 一场比赛可能有更多的天数。这是简单的模型:

Race (id)

Day (id, race_id, is_active, is_deleted)

我想通过 Doctrine 在 Symfony2 项目中访问更高级的 - Race - 并在 Twig 模板中显示结果。对于直接的 Race 属性,这很容易。

但是,当我想在 Race 中使用自定义定义的方法(某种标志,我们称之为 hasActiveDays())来反映比赛是否有任何活动且未删除的日子时,它变得更加棘手。简单的 Doctrine 关系是不够的,所以我需要使用这样的查询:

SELECT d FROM mtboLibBundle:Day d WHERE d.isActive = 1 AND d.isDeleted = 0 AND d.raceId = :id

我的问题基本上是在哪里/如何实现此查询以及如何在 twig 模板中调用它?到目前为止,我尝试的任何操作都会导致各种错误,所以如果有人可以提供帮助,我将不胜感激.

即这是一个尝试:

class RaceRepository extends EntityRepository {
    public function hasActiveDays() {
        $em = $this->getEntityManager();
        $query = $em->createQuery('SELECT f FROM mtboLibBundle:Day d
            WHERE d.isActive = 1
            AND d.isDeleted = 0
            AND d.raceId = :id')
                ->setParameter('id', $this->id)
                ;
        $days = $query->getResult();
        return (count($days) == 0) ? false : true;
    }
}

方法不存在 - 从模板调用时:

{{ race.hasActiveDays }}

【问题讨论】:

  • Custom Repository Classes 开头并将结果发送到视图。
  • 我试过了,结果是“方法不存在”错误。
  • 好的,不确定您是否需要客户存储库,您能向我们展示您的完整树枝模板吗?
  • 只有很多不相关的 HTML。这个调用是关键:{{race.hasActiveDays }}
  • 我想知道这个调用是否是for 循环的一部分。在您的特定情况下,我认为您甚至不需要创建函数hasActiveDays。您可能可以依赖您在视图中使用的对象的属性。

标签: symfony doctrine-orm twig


【解决方案1】:

我认为您无法按照您尝试的方式调用存储库中的函数。我所做的一件事是在实体类上放置一个函数,您可以从模板中调用它。

在您的 Race 课程中:

public function hasActiveDays(){
    // here, perhaps pull all of the days for this race - maybe from a doctrine relation
    // loop through, filter, etc.
    // return whatever is appropriate
}

...然后,在您的模板中,您将能够按照您在上面尝试的方式调用该函数。

【讨论】:

  • 这个我也试过了。问题是如何从 az 实体类中进行查询。像 $this->getEntityManager() 或 $this->getDoctrine() 这样的调用在这里不起作用,因为 $this 指的是实体本身。
  • 基于我做类似事情的方式,在 Race 中你有一个 Days 属性,它与你的 Days 实体有 '@ORM\OneToMany' 关系,在你的构造函数中是 '$this->days = new ArrayCollection()' 和一个返回该集合的方法 'getDays()',然后您可以在 Race 实体上使用名为 'hasActiveDays()' 的方法,该方法循环通过 '$this->getDays()' 查找处于活动状态(我假设这是 Day 的一个属性)并返回该列表。更多关于教义关系的信息仅供参考:link
  • 太棒了!!!您介意将我的答案标记为已接受吗?我是新来的,正在努力建立一些代表。谢谢! :-)
  • 我做到了。但。 :) 这对于标记方法来说很棒,但是如果我想列出那些活跃的、未删除的日子怎么办?有没有更好的方法然后循环通过 $this->getDays() 并构建一个对象数组?是否可以在实体内部进行查询?
  • 谢谢!但。 :-) 也许我对您的数据模型的理解不够好。如果 "active" 是天数的属性,在 hasActiveDays() 函数中,首先创建一个 ArrayCollection ($activeDays = new ArrayCollection()),然后循环遍历比赛的天数 (foreach($this->getDays() as $day){ if ($day->active == true) { $activeDays->add($day); } }。也许可以在实体内部进行查询,但这样做不是最佳做法。如果我不理解您在寻找什么,那么也许可以再澄清一些,我们会看看我们在哪里。
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多