如何在symfony中动态更改doctrine查询

时间:2015-11-06 10:04:17

标签: symfony doctrine-orm

让我们说,我有一个带有Orm \ OneToMany关系的类电影到Actors类。

我已经有了一个关于$ movie-> getActors()的getter的工作示例;这将返回该电影的所有演员。

但是如何动态修改查询呢?例如,我显示了电影中所有演员的列表,并允许用户按名称,年龄,性别等进行排序。

=====编辑======

在学习之后,这些东西属于知识库类(感谢Yoshi,scoolnico),这里有一个改编的问题:

让我们说,我有一部电影ID 4711.我将拍摄电影:

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    android:fitsSystemWindows="true"
    android:minHeight="?attr/actionBarSize"
    android:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

现在,我需要按照名称(例如)对这部电影中的所有演员进行排序。

$movie = $this->getDoctrine()
    ->getRepository("Movie")
    ->find(4711);

这真的是正确的方法吗? 有了这个版本,我需要在控制器中知道电影和演员之间的关系是如何工作的!这是一件事,学说应该为我处理!

如何在多部电影中使用它?

$actorsOfMovie = $this->getDoctrine()
    ->getRepository("Actor")
    ->findBy(array("movie_id" => 4711), array('name'=>'asc'));

2 个答案:

答案 0 :(得分:1)

您只需在类Repository中创建一个特定的函数:

/.../
$em = $this->getDoctrine()>getManager();
$repository = $em->getRepository('YourBundle:Movie');
$actors = $repository->getActorByGender('male');
/.../

在你的控制器中:

ftp://username:password@sld.domain.tld/path1/path2/ 

答案 1 :(得分:0)

我认为最好的解决方案是使用doctrine的Criteria类(http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#filtering-collections)。

查看https://www.boxuk.com/insight/blog-posts/filtering-associations-with-doctrine-2

基于此,我可以做到以下几点:

// In the Movie Class
/**
 * Get actors
 *
 * @param array $options
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getActors($options = array())
{
    if(!$options) {
        return $this->actors;
    }

    $criteria = Criteria::create();

    if(isset($options["order_by"])) {
        $criteria->orderBy($options["order_by"]);
    }
    if(isset($options["limit"])) {
        $criteria->setMaxResults($options["limit"]);
    }
    if(isset($options["offset"])) {
        $criteria->setFirstResult($options["offset"]);
    }
    // Or I can define other filters or sorting stuff
    if(..) {
        ...
    }

    return $this->actors->matching($criteria);
}