让我们说,我有一个带有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'));
答案 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);
}