这似乎是一个基本的要求,但我似乎无法让它工作,所以我要么错过了一些愚蠢的东西,要么就是不明白应该怎么做.提前致谢.
我有两个具有多对多关系的学说实体:项目和类别.其中有items_has_categories加入.
/**
* Item
*
* @Table(name="items")
* @Entity(repositoryClass="Entity\Repository\Item")
*/
class Item
{
....
/**
* @var Categories
*
* @ManyToMany(targetEntity="Categorie", inversedBy="items", cascade={"persist"})
* @JoinTable(name="items_has_categories",
* joinColumns={
* @JoinColumn(name="items_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @JoinColumn(name="categories_id", referencedColumnName="id")
* }
* )
*/
private $categories;
....
}
/**
* Categorie
*
* @Table(name="categories")
* @Entity(repositoryClass="Entity\Repository\Categorie")
*/
class Categorie
{
.....
/**
* @var Items
*
* @ManyToMany(targetEntity="Item", mappedBy="categories")
*/
private $items;
....
}
Run Code Online (Sandbox Code Playgroud)
而我正在尝试做的是运行一个查询来返回所有"x"类别的所有项目 - 我认为/认为应该是SELECT with和AND子句:
class Item extends …Run Code Online (Sandbox Code Playgroud) 我的"params"集合中有一个文档,如下所示:
{
"_id": ObjectId("4d124cef3ffcf6f410000037"),
"code": "color",
"productTypes": [
{
"$ref": "productTypes",
"$id": ObjectId("4d120a2d2b8d8d3010000000"),
"$db": "test"
}
]
}
Run Code Online (Sandbox Code Playgroud)
引用的文件是这样的:
{
"_id": ObjectId("4d120a2d2b8d8d3010000000"),
"code": "car"
}
Run Code Online (Sandbox Code Playgroud)
我正在使用DoctrineODM来获取引用"productType"为"car"的"param"文档.我正在使用此代码:
$query = $dm->createQuery('Cms\Model\Param');
$query->field('productTypes.code')->equals('car');
$result = $query->execute();
var_dump($result);
Run Code Online (Sandbox Code Playgroud)
但结果是一个空数组.我怎样才能做到这一点?
我很确定DQL将成为可行的方法,但我想知道Doctrine,我使用的是Doctrine 2,是否有某种程度可以返回行数.我不会使用行本身,我只想要计数.
我应该如何通过doctrine存储库查询中的鉴别器列进行排序?
我有一个非常直接的设置,我有不同类型的支付细节,它可以是信用卡(CC)或借记订单(DO).
所以我已经实现了单表继承映射策略来实现这一点,但是当我尝试通过鉴别器列进行排序时,问题就出现了,因为鉴别器列不存在于基类中.
存储库功能:
public function getPaymentDetails (ClientContactInterface $clientContact)
{
$dql = 'SELECT pd
from
AccountingBundle:PaymentDetail pd
JOIN ClientProductBundle:ClientProduct cp
WITH cp.payment_detail_id = pd.id
WHERE
cp.payment_detail_id = pd.id
and cp.client_contact_id = :client_contact_id
GROUP BY pd.id
ORDER BY pd.method_type'; // Since pd.method_type is the discriminator column, I cannot order by it. And I need to be able to.
$em = $this->getEntityManager();
$query = $em->createQuery($dql)->setParameter('client_contact_id', $clientContact->getId());
return $query->getResult();
}
Run Code Online (Sandbox Code Playgroud)
Base PaymentDetail实体:
/**
* @ORM\Entity(repositoryClass="AccountingBundle\Repository\PaymentDetailRepository")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\Table(name="PaymentDetails")
* @ORM\DiscriminatorColumn(name="PaymentMethodType", type="string")
* …Run Code Online (Sandbox Code Playgroud) 我有一个Doctrine模型(Assignment),它与另一个模型(Region)有多对一的关系.分配由用户拥有(每个用户一次只能为每个区域分配一个分配),我试图用来indexBy分配用户的分配数组,并使用分配区域的ID.但是,我只获得标准的0..n数字键.
当我尝试运行DQL查询时SELECT am, reg, user FROM Assignment am INDEX BY [...] JOIN am.region reg JOIN am.user user WHERE user.id = ?1,INDEX BY的这些值都不起作用:
region (错误:PathExpression无效.必须是StateFieldPathExpression.)region_id (错误:类... \赋值没有名为region_id的字段或关联)region.id (错误:字符串的预期结束,得到'.')这可能吗?如果没有,那么User在没有区域的情况下访问某个区域的分配的便捷方式是indexBy什么?
我在尝试使用QueryBuilder或DQL时遇到问题.
我有以下关系:
用户<-1:n-> Profile <-n:m-> RouteGroup <-1:n-> Route
我想创建一个DQL,列出特定用户有权访问的所有路由.我可以使用以下代码获取此信息:
$usr = $this->container->get('security.context')->getToken()->getUser();
foreach ($usr->getProfiles() as $profile){
foreach ($profile->getRoutegroups() as $routegroup){
var_dump($routegroup->getRoutes()->toArray());
}
}
Run Code Online (Sandbox Code Playgroud)
由于显而易见的原因,我无法使用此代码,否则我将重载我的服务器,大声笑.
我尝试了以下方法:
DQL:
$em->createQuery('SELECT p FROM CRMCoreBundle:User u
JOIN CRMCoreBundle:Profile p
JOIN CRMCoreBundle:RoleGroup rg
JOIN CRMCoreBundle:Role r
WHERE
u.id=:user')
->setParameter('user', $user->getId())
->getResult();
Run Code Online (Sandbox Code Playgroud)
QueryBuilder(我尝试使用u.profiles - 关系的名称而不是实体 - 但这也不起作用):
$em->createQueryBuilder()
->select('r')
->from('CRMCoreBundle:User', 'u')
->innerJoin('u.profiles','p')
->where('u.id = :user_id')
->setParameter('user_id', $user->getId())
->getQuery()
->getResult();
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗???
更新:我尝试了Zeljko的解决方案并制作了这个脚本:
return $this->getEntityManager()
->createQueryBuilder()
->select('u, r')
->from('CRMCoreBundle:User', 'u')
->innerJoin('u.profiles','p')
->innerJoin('p.routegroups','rg')
->innerJoin('rg.routes','r')
->where('u.id = :user_id')->setParameter('user_id', $user->getId())
->getQuery()
->getResult(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用DATE_ADDdoctrine2中的函数,但我遇到了麻烦.
我在DQL中使用这样的:
->andWhere('p.created_at <= DATE_ADD(CURRENT_DATE(),4, day)')
Run Code Online (Sandbox Code Playgroud)
但我收到语法错误:
[语法错误]第0行,第215行:错误:预期'.' 或''',得到'天'
我尝试了不同的实现,但我总是得到某种语法错误.
我检查了包含此函数的DoctrineExtensions,但我不需要它,因为该函数已经包含在doctrine中.
我正在尝试通过它们是否与属性上的原始实体匹配来对查询结果进行排序.我可以使用以下查询在mySQL中轻松完成此操作:
SELECT * FROM table
ORDER BY prop = 'value' DESC;
Run Code Online (Sandbox Code Playgroud)
但是,在Doctrine中,当我尝试以下操作时:
// $qb is an instance of query builder
$qb->select('e')
->from('Entity', 'e')
->orderBy('e.prop = :value', 'DESC')
->setParameter('value', 'value');
// grab values
Run Code Online (Sandbox Code Playgroud)
我得到一个Doctrine语法错误,'结束字符串'.我研究了创建一个自定义函数,但这看起来有点过分.我对Doctrine很新,有没有更好的方法呢?
我正在尝试创建一个包含收集类型数据的表单,具体取决于所记录的用户.我正在关注Symfony食谱的这一章.
当query_builder选项是一个闭包,我从DQL获取数据时,一切正常.由于需要从代码中的不同位置获取数据,我更愿意在Repository类中定义查询.
这是我的存储库中的函数:
public function findOwnedBy($user) {
$query = $this->getEntityManager()->createQuery("SELECT l FROM MyBundle:Article a JOIN a.owndBy u WHERE u.id = :userId");
$query->setParameters(array("userId"=>$user->getId()));
return $query->getResult();
}
Run Code Online (Sandbox Code Playgroud)
在Controller中调用并返回Article数组时,此函数有效.这是symfony doc的片段:
$formOptions = array(
'class' => 'Acme\DemoBundle\Entity\User',
'multiple' => false,
'expanded' => false,
'property' => 'fullName',
'query_builder' => function(EntityRepository $er) use ($user) {
// build a custom query, or call a method on your repository (even better!)
},
);
Run Code Online (Sandbox Code Playgroud)
当我在query_builder中调用我的Repository函数时,我收到一个错误:Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given我可以理解,因为我的Repository返回一个Entity数组,而不是QueryBuilder.
我不想在表单中复制代码并创建新的QueryBuilder.从存储库中使用查询的最佳做法是什么?我想在存储库中有两个函数,一个返回一个数组,另一个返回QueryBuilder,但是Symfony doc中的注释" …
使用dql我试图检查实体是否是集合子实体的成员
product
customer
customer.orders (collection)
customer.orders.products (collection, type: product)
customer.cancellations.productContainers (collection)
customer.cancellations.productContainers.product (entity, type: product)
Run Code Online (Sandbox Code Playgroud)
客户有多个订单.订单有多个产品.客户有多次取消.取消有多个productContainers.productContainer有一个产品.
我想获得所有未被取消的订购产品.
$qb->select('c, d, p')
->from('XyzBundle:Customer', 'c')
->leftJoin('c.orders', 'co')
->leftJoin('co.products', 'cop')
->leftJoin('c.cancellation', 'ca')
->leftJoin('ca.productContainers', 'cap')
->leftJoin('cap.product', 'capp')
->andWhere('cop NOT MEMBER OF capp')
Run Code Online (Sandbox Code Playgroud)
但是这不起作用,因为ca.productContainers是集合字段而不是它的supentity ca.productContainers.product.因此我收到以下错误:
CRITICAL - Uncaught PHP Exception Doctrine\ORM\Query\QueryException:
"[Semantical Error] line 0, col 414 near 'product': Error: Invalid PathExpression.
Must be a CollectionValuedAssociationField." at
/vagrant/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php line 4 9
Run Code Online (Sandbox Code Playgroud)
有什么建议如何解决这个问题?
dql ×10
doctrine-orm ×6
doctrine ×5
symfony ×4
many-to-many ×1
many-to-one ×1
mongodb ×1
php ×1
sql ×1