我在http://symfony.com/doc/current/bundles/DoctrineMongoDBBundle/index.html使用Symfony(版本2.5.0-DEV)和doctrine mongodb cookbook。
我暂时试图将已定义参数的值传递给findOneByIndex。
因此,如果我执行以下$script = $repository->findOneByIndex(1);
,它就能完美运行。
但是,如果我执行以下$script = $repository->findOneByIndex($user);
,则无法使用user的值进行搜索。
在routing.yml中,我有这个pattern: platform/designing/users/{user}/showuser
,在控制器中我只是在showuserAction下执行此操作:
$repository = $this->get('doctrine_mongodb')->getManager()->getRepository('MyMpBundle:Scripts');
$script = $repository->findOneByIndex($user);
任何帮助将不胜感激:)。
答案 0 :(得分:2)
在上一个代码示例中,$user
变量的类型是什么?我假设它可能是一个字符串,如果它是一个路由参数并来自URI。您可以使用var_dump()
一次性获取类型和值。
根据之前的评论,您说Scripts文档包含以下字段:
如果MongoDB文档中的index
字段是整数,则需要在查询中使用整数。例如,findOneByIndex('1')
与其字段中具有整数1
的文档不匹配。这里的最佳做法是在查询之前将cast您的值设置为适当的类型。最好停止依赖神奇的DocumentRepository方法并明确定义自己的findBy
方法,这些方法在内部进行转换。然后,您的控制器可以直接从路由或请求参数传递数字字符串,而不必担心自己进行整数转换。
另外,要对原始代码示例发表评论:
$script = $repository->findOneByIndex($user);
这是针对路由模式platform/designing/users/{user}/showuser
的。你说这没能找到结果。我假设您的控制器的$user
参数是用户ID。如果是这种情况,为什么要查询index
字段而不是user_id
?
答案 1 :(得分:1)
此值应为整数,而不是对象。请传递id或索引值 - 我不知道它是如何存储在mongodb中的。
$repository = $this->get('doctrine_mongodb')->getManager()->getRepository('MyMpBundle:Scripts');
$script = $repository->findOneByIndex($user->getId());
答案 2 :(得分:0)
您是否已将$user
转移到showuser
行动?像这样(注意$ user作为参数):
public function showuserAction($user)
{
$repository = $this->get('doctrine_mongodb')->getManager()->getRepository('MyMpBundle:Scripts');
$script = $repository->findOneByIndex($user);
}
PS。我建议你将var $user
更改为$userId
,不要误解为$ user对象
答案 3 :(得分:0)
使用echo函数,我可以看到它只在输入值(而不是参数)时有效。请参阅下面的完整控制器脚本。任何帮助将不胜感激:)
<?php
// src/My/MpBundle/Controller/UserController.php
namespace My\MpBundle\Controller;
use Atlas\MpBundle\Document\Scripts;
use Symfony\Component\HttpFoundation\Response;//Write the html inside controller
use Symfony\Component\HttpFoundation\JsonResponse;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class UserController extends Controller
{
public function showuserAction($userId)
{
//creating the repository below to help fetch objects
$repository = $this->get('doctrine_mongodb')->getManager()->getRepository('MyMpBundle:Scripts');
//below method queries based on the user_id column.
$script = $repository->findOneBy(array('user_id' => $userId));
if (!$script) {
throw $this->createNotFoundException('No product found for user with id '.$userId);
}
echo $script->getuserid();
}
}
?>
答案 4 :(得分:0)
谢谢jmikola。 {user}或多或少是一个参数,它带有一个值。我查询了要测试的索引以及user_id,但它们都没有工作(使用索引进行测试,因为它与user_id具有相同的整数,并避免在user_id中使用下划线)。问题是将$ user传递给控制器并使用findOneBy
仅适用于Id而不是index或user_id。那就是:
findOneById($userId); //works
findOneByIndex($userId); //fails
findOneByUserId($userId); //fails
我的文档脚本粘贴在下面:
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Bundle\MongoDBBundle\Validator\Constraints\Unique as MongoDBUnique;
/**
* @MongoDB\Document
*/
class scripts
{
/**
* @MongoDB\Id
*/
public $id;
/**
* @MongoDB\String
*/
public $name;
/**
* @MongoDB\String
*/
public $description;
/**
* @MongoDB\String
*/
public $group;
/**
* @MongoDB\Int
*/
public $index;
/**
* @MongoDB\Boolean
*/
public $closed;
/**
* @MongoDB\Int
*/
public $user_id;
/**
* @MongoDB\String
*/
public $appearance;
/**
* Get id
*
* @return id $id
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
* @return self
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string $name
*/
public function getName()
{
return $this->name;
}
/**
* Set description
*
* @param string $description
* @return self
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
/**
* Get description
*
* @return string $description
*/
public function getDescription()
{
return $this->description;
}
/**
* Set group
*
* @param string $group
* @return self
*/
public function setGroup($group)
{
$this->group = $group;
return $this;
}
/**
* Get group
*
* @return string $group
*/
public function getGroup()
{
return $this->group;
}
/**
* Set index
*
* @param int $index
* @return self
*/
public function setIndex($index)
{
$this->index = $index;
return $this;
}
/**
* Get index
*
* @return int $index
*/
public function getIndex()
{
return $this->index;
}
/**
* Set closed
*
* @param boolean $closed
* @return self
*/
public function setClosed($closed)
{
$this->closed = $closed;
return $this;
}
/**
* Get closed
*
* @return boolean $closed
*/
public function getClosed()
{
return $this->closed;
}
/**
* Set userId
*
* @param int $userId
* @return self
*/
public function setUserId($userId)
{
$this->user_id = $userId;
return $this;
}
/**
* Get userId
*
* @return int $userId
*/
public function getUserId()
{
return $this->user_id;
}
/**
* Set appearance
*
* @param string $appearance
* @return self
*/
public function setAppearance($appearance)
{
$this->appearance = $appearance;
return $this;
}
/**
* Get appearance
*
* @return string $appearance
*/
public function getAppearance()
{
return $this->appearance;
}
}