Найти ссылку на доктрину-mongodb

У меня есть коллекции пользователей и сообщений.

Пользователь выглядит как

{ "_id" : ObjectId("5089cc4c7b03b9902b000000"), "facebook_id" : "522128874" }

Пост выглядит как

{ "_id" : ObjectId("508aa21b7b03b9780800000f"), "facebook_id" : "10150709375878875", "user" : DBRef("User", ObjectId("5089cc4c7b03b9902b000000")), "message" : " Julia dream, dreamboat queen, queen of all my dreams", "updated_time" : 1333502938 }

Я хочу найти все сообщения определенного пользователя.

$user = $userRepo->findOneByFacebookId('522128874');
$posts = $postRepo->findOneByUser($user)

Не работает Я также пытался

$posts = $postRepo->findOneBy(array('user' => $user))

а также

$posts = $postRepo->findOneBy(array('user' => $user->getId()))

3 ответа

Решение

Если вы правильно сопоставили отношения документа, все, что вам нужно сделать, это просто

$user = $userRepo->findOneByFacebookId($fbid);
$posts = $user->getPosts();

Возможно, вы захотите взглянуть на документацию доктрина двунаправленных ссылок

Если вы хотите найти сообщения пользователя вручную (более утомительный способ), вам нужно создать метод findOneByUser($user) в вашем репозитории Post. Затем вам нужно будет преобразовать идентификатор пользователя в MongoId, а затем использовать построитель запросов, чтобы сопоставить поле user.$ Id с MongoId, которое будет возвращать курсор (и).

Помните, что когда вы создаете документ (в данном случае публикацию), в котором есть ссылка на другой документ, он сохраняет ссылку через его MongoId, поэтому вы не можете просто выполнить findOneByUser($user), если вы не создали этот метод самостоятельно.

Бам!

$posts = $postRepo->findOneBy(array('user.id' => $user->getId()))

Попробуйте, сработало для меня. Может показаться глупым, что вам придется запрашивать все элементы.

Вы должны использовать метод reference () в Query Builder для @ReferenceOne, например https://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/query-builder-api.html

$qb = $postRepo->createQueryBuilder('u')
               ->field('user')->references($user);


PS: используйте includeReferenceTo () @ReferenceMany

Другие вопросы по тегам