Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用条令和符号查询数据库数据_Php_Symfony_Doctrine - Fatal编程技术网

Php 如何使用条令和符号查询数据库数据

Php 如何使用条令和符号查询数据库数据,php,symfony,doctrine,Php,Symfony,Doctrine,我有一条这样的线 // $repository is my repository for location data $locationObject = $repository->findOneBy(array('name' => $locationName)); 它从位置表中选择可以找到的第一条记录。这很公平 但是,为了使查询更精确,我在该表中添加了一些额外的数据。特别是“项目名称”列。在Location类中,它被指定为: /** * @ORM\ManyToOne(targ

我有一条这样的线

 // $repository is my repository for location data
 $locationObject = $repository->findOneBy(array('name' => $locationName));
它从
位置
表中选择可以找到的第一条记录。这很公平

但是,为了使查询更精确,我在该表中添加了一些额外的数据。特别是“项目名称”列。在Location类中,它被指定为:

/**
 * @ORM\ManyToOne(targetEntity="Item", inversedBy="locations", cascade={"persist", "remove"})
 * @ORM\JoinColumn(name="item_id", referencedColumnName="item_id", onDelete="CASCADE")
 */
protected $item;
因此,还有一个Item表,其中包含Item\u id、Item\u name等

我要做的是将原来的
findOneBy()
也更改为按项目名称过滤。所以我想要这样的东西:

 $locationObject = $repository->findOneBy(array('name' => $locationName, 'item' => $itemName));
但是因为
$item
是Locations类中的一个对象,而不是字符串或ID,所以显然不起作用。所以我真的很想反对item->getName()

我不知道该怎么做。有人有什么建议吗


谢谢

您必须使用自定义dql。您可以使用querybuilder构建它

//in your controller
protected function getEntities($itemName){
    $em = $this->get('doctrine.orm.default_entity_manager');
    $qb = $em->createQueryBuilder();
    $qb->select('a')->from('YourBundleAlias:YourEntityName', 'a')->join('a.item','b')->where('b.item = :item')->setParameter('item', $itemName);
    return $qb->getQuery()->execute();
}

我想您必须使用join创建一个自定义查询。最好为该实体创建一个自定义存储库类,然后在其中创建一个自定义查询构建

实体:

// src/AppBundle/Entity/Foo.php

/**
 * @ORM\Table(name="foo")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\FooRepository")
 */
 class Foo 
 {
    ...
 }
您的存储库:

 // src/AppBundle/Repository/FooRepository.php

 use Doctrine\ORM\EntityRepository;

 class FooRepository  extends EntityRepository  
 {
    public function findByYouWant($id)
    {
       // your query build
    }
 }
控制器:

 // src/AppBundle/Controller/FooController.php

 use Symfony\Bundle\FrameworkBundle\Controller\Controller;

 class FooController extends Controller
 {
     public function showAction() 
     {
        // ... your code
        $locationObject = $repository->findByYouWant($id);
     }
 }
这很容易做到:

$locationObject = $repository->findOneBy(array(
    'name' => $locationName, 
    'item' => $itemObject
));

使用Doctrine2为了在相关实体字段上执行findBy,您必须提供一个实体实例:
$itemObject

您应该向Location repository类添加一个方法,并创建一个与下面类似的查询:

class LocationRepository extends EntityRepository
{
    public function findLocationByItemName($locationName, $itemName)
    {
        $qb = $this->createQueryBuilder('location');
        $qb->select('location')
            ->innerJoin(
                'MyBundle:Item',
                'item',
                Query\Expr\Join::WITH,
                $qb->expr()->eq('location.item', 'item.item_id')
            )
            ->where($qb->expr()->like('location.name', ':locationName'))
            ->andWhere($qb->expr()->like('item.name', ':itemName'))
            ->setParameter('locationName', $locationName)
            ->setParameter('itemName', $itemName);
        $query = $qb->getQuery();

        return $query->getResult();
    }
}