无法将参数值传递给findOneBy Symfony存储库

时间:2014-01-13 11:37:58

标签: php mongodb symfony doctrine-orm persistence

我在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);

任何帮助将不胜感激:)。

5 个答案:

答案 0 :(得分:2)

在上一个代码示例中,$user变量的类型是什么?我假设它可能是一个字符串,如果它是一个路由参数并来自URI。您可以使用var_dump()一次性获取类型和值。

根据之前的评论,您说Scripts文档包含以下字段:

  • _id
  • name(string)
  • description(string)
  • index(整数)
  • user_id(整数)

如果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;
}
}