【问题标题】:Doctrine2 - FindOneBy foreign keysDoctrine2 - FindOneBy 外键
【发布时间】:2017-03-15 10:35:08
【问题描述】:

我的问题是,我有表 movies_status,其中有两个外键:“电影”和“谁”。我正在尝试进行 DQL 查询,在其中我通过对象找到单行,外键的 id,但它什么也没找到。

实体:

/**
 *
 * @var type 
 * 
 * @ORM\ManyToOne(targetEntity="movies")
 * @ORM\JoinColumn(name="movie", referencedColumnName="id")
 */
private $movie;

/**
 *
 * @var type 
 * 
 * @ORM\ManyToOne(targetEntity="list_base")
 * @ORM\JoinColumn(name="who", referencedColumnName="id")
 */
private $who;

控制器

/**
 * 
 * @Route("/introduction/updateTime", options={"expose"=true}, name="int_update_time")
 * @Method("post")
 */
public function updateTimeAction(Request $request) {

    $time = floor($request->request->get('time'));
    $movieUsId = $request->request->get('film_id');
    $userId = $request->request->get('id');

    $em = $this->getDoctrine()->getManager();

    $movie = $em->getRepository('MainBundle:movies')->findOneBy(['useable_id' => $movieUsId]);
    $user = $em->getRepository('MainBundle:list_base')->findOneById($userId);

//here it finds nothing        
$moviesStatus = $em->getRepository('MainBundle:movies_status')->findOneBy(['who' => $user, 'movie' => $movie]);
        $currentTime = $moviesStatus->getFilmTime();

        $moviesStatus->setFilmTime($time);
        $em->persist($moviesStatus);
        $em->flush();

        if ($time == $currentTime) {
            return new Response("koniec");
        }

        return new Response("ok " . $time . " " . $userId . " " . $movieUsId . " " . $movie->getId() . " " . $user->getFirstName());
    }

错误总是:

Call to a member function getFilmTime() on null

在控制器中,我也尝试按 ID 搜索,但仍然没有。 我还尝试在存储库中创建自定义查询:

 public function findOneMS($user, $movie) {

    $q = $this->getEntityManager()
            ->createQuery('SELECT u FROM MainBundle:movies_status u WHERE u.who = :userId AND u.movie = :movieId')
            ->setParameter('userId', $user)
            ->setParameter('movieId', $movie)
            ->getSingleResult();
    return $q;
}

是的,数据库中存在行。 提前致谢。

【问题讨论】:

  • 您是否尝试过:$moviesStatus = $em->getRepository('MainBundle:movies_status')->findOneBy(['who' => $user->getId(), 'movie' => $movie->getId()]);
  • 是的,我做到了。仍然出现错误Call to a member function getFilmTime() on null
  • 用分析器检查查询是否正常以及是否存在符合条件的数据
  • 查询似乎没问题:SELECT t0.id AS id_1, t0.film_time AS film_time_2, t0.open_date AS open_date_3, t0.movie AS movie_4, t0.who AS who_5 FROM movies_status t0 WHERE t0.who = ? AND t0.movie = ? LIMIT 1 Parameters: [0 => 35, 1 => 3]
  • 也许在这里按 ID 搜索是错误的方式?

标签: php mysql symfony doctrine-orm


【解决方案1】:

您的两个多对多关系创建了两个额外的表,您应该在请求中使用它们。

查询应如下所示:

SELECT s.id FROM movies_status s, movies_status_movies m, movies_status_list_base u WHERE s.id = m.movies_status_id AND s.id = u.movies_status_id AND m.movie_id = :movieId AND u.list_base_id = :userId

然后通过返回的 id 加载您的实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2011-09-15
    相关资源
    最近更新 更多