【问题标题】:Symfony Order entities by field OneToManySymfony 按字段 OneToMany 排序实体
【发布时间】:2015-12-03 13:50:51
【问题描述】:

谁知道如何解决这个简单的问题? 我有一个实体项目,其字段为likedUsers,并在树枝中计数该字段,但我希望按此计数(DESC)订购项目 - 首先谁有更多的likeUsers。怎么做?在查询生成器或树枝中创建过滤器?帮助学说我知道计数

"likes_user" => count($this->getLikedUsers()->getValues())

如何从这个领域对我的所有项目进行排序?

或者它是如何使用查询生成器解决的? 类似的东西,但这不起作用:

public function getProjects()
{
    $qb = $this->getEntityManager()->createQueryBuilder('d');
    $qb
        ->select('d')
        ->from('AppBundle:Project', 'd')
        ->where('d.confirm = :identifier')
        ->setParameter('identifier', 'approved')
        ->orderBy('COUNT(d.likedUsers)', 'DESC')
        ->getQuery()
        ->getResult()
    ;
    $query = $qb->getQuery();
    $results = $query->getResult();
    return $results;
}

实体:

/**
 * Project
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AppBundle\Entity\ProjectRepository")
 */
class Project implements \JsonSerializable
{
    /**
     * @var Collection
     *
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\User", mappedBy="likedProjects")
     */
    private $likedUsers;




{% for project in projects %}
<div>LIked: <span>{{ project.likedUsers|length|number_format(0, '.', ' ') }}</span></div>
{% endfor %}

我觉得可能是这样的:

{% for project in projects.likedUsers|length|sort %}

但不影响
也许谁知道?数组项目如何按字段 LikedUser 的计数排序。我不知道该怎么做。查询生成器或树枝扩展或 usort..

【问题讨论】:

    标签: php symfony doctrine-orm twig


    【解决方案1】:

    恕我直言,这似乎是PHP 而不是Doctrine 的工作。不确定Doctrine 是否可以实现 t,如果可能,会产生什么影响。

    一种方法是usort()

    $projects = ...;
    usort($projects, function($p1, $p2){ 
        // Both $p1 and $p2 are instance of Project
        // Assuming that `getLikedUsers()` return Doctrine `Collection`...
    
        return count($p1->getLikedUsers()) > count($p2->getLikedUsers());
    });
    

    usort 接受一个数组,并在每次传递中提供两个项目(在您的情况下为两个项目)供您决定哪个“更大”。对你来说,点赞多的项目肯定是“大”吧?

    希望这会有所帮助...

    【讨论】:

    • 更新我的问题。我不明白 $p1、$p2 和 size() 怎么样?也许 count($project->getLikedUser()->getValues()) 或者我不明白
    • 如果我做对了,你有一个 projects 的列表,你需要按“likedUsers”的数量对它们进行排序。对吗?
    • 好 :) 我已经更新了答案...您没有通过 $p1$p2...usort 为您这样做...
    • 但是我有 $projects = array() 它是什么函数($p1, $p2) ?
    【解决方案2】:

    我用查询生成器解决了。我只添加了喜欢用户的项目 - 用户住在某个城市而不是所有城市

    public function getProject()
    {
        $qb = $this->getEntityManager()->createQueryBuilder('d');
        $qb
            ->select('d')
            ->from('AppBundle:Project', 'd')
            ->addSelect('COUNT(m.id) as nMethods')
            ->join('d.likedUsers', 'm')
            ->join('m.location', 'l')
            ->where('l.city = :identifier')
            ->setParameter('identifier', 'someCity')
            ->groupBy('d.id')
            ->orderBy("nMethods", 'DESC')
    
            ->getQuery()
            ->getResult()
        ;
        $query = $qb->getQuery();
        $results = $query->getResult();
        return $results;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 2015-10-24
      • 2022-10-04
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多