我正在尝试进行分页,但是有一个错误:
[语法错误]第0行,第57行:错误:字符串的预期结束,得到'限制'
我不太确定这是否是正确的语法(和逻辑)来进行查询:
public function getFriendsFromTo ($user, $limit, $offset)
{
return $this->getEntityManager()
->createQuery('SELECT f FROM EMMyFriendsBundle:Friend f WHERE f.user='.$user.' limit '.$limit. 'offset' .$offset)
->getResult();
}
Run Code Online (Sandbox Code Playgroud)
朋友和用户是相关的很多ToOne和oneToMany,所以在friends表中有一个字段 - user_id.
这是在我的控制器中:
$user = $this->get('security.context')->getToken()->getUser();
$id = $user->getId();
$friends = $user->getFriends();
$result = count($friends)
$FR_PER_PAGE = 7;
$pages = $result/$FR_PER_PAGE;
$em = $this->getDoctrine()->getEntityManager();
$friends = $em->getRepository('EMMyFriendsBundle:Friend')
->getFriendsFromTo($id, $FR_PER_PAGE, $page*$FR_PER_PAGE);
Run Code Online (Sandbox Code Playgroud)
我知道它是愚蠢甚至错误的(特别是第三个参数$page*$FR_PER_PAGE
),但我只想尝试查询是否有效,但事实并非如此.
我将参数设置为数组,如http://jmsyst.com/libs/serializer/master/reference/annotations中所述
class QuestionAnswer
{
/**
* @JMS\Type("ArrayCollection<Rest\Bundle\Entity\Fixture\QuestionOptions>")
* @Groups({"QuestionAnswer"})
*/
public $question_options_array ;
}
Run Code Online (Sandbox Code Playgroud)
并在另一个类中定义一些选项
class QuestionOptions
{
/**
* @JMS\Type("integer")
* @Groups({"get_option"})
*/
public $question_option_id ;
/**
* @JMS\Type("string")
* @Groups({"post_option"})
*/
public $question_option_description;
}
Run Code Online (Sandbox Code Playgroud)
在@ApiDoc我定义
* input={
* "class" = "Rest\BeautyBundle\Entity\Fixture\ProfileQuestionAnswer",
* "groups"={"QuestionAnswer", "get_option"},
* },
Run Code Online (Sandbox Code Playgroud)
在更新之前它运作良好.但composer update
只有"QuestionAnswer"组名称起作用后才能显示QuestionOptions类的所有属性.如何以更新前的方式提交数组中的属性?
当我阅读有关存储库的文档时,通常使用实体和集合,但是以"只读"的方式.
从来没有存储库具有类似insertUser(User $user)
或的方法的示例updateUser(User $user)
.
但是,在使用SOA时,Service不应该使用Entity Manager(这是对的,不是吗?)所以:
从这两个问题,另一个问题,我的服务应该明确persist()
和flush()
我的实体吗?
这是我的功能,我试图显示用户历史记录.为此,我需要显示用户的当前信用以及他的信用记录.
这就是我想要做的:
public function getHistory($users) {
$qb = $this->entityManager->createQueryBuilder();
$qb->select(array('a','u'))
->from('Credit\Entity\UserCreditHistory', 'a')
->leftJoin('User\Entity\User', 'u', \Doctrine\ORM\Query\Expr\Join::WITH, 'a.user = u.id')
->where("a.user = $users ")
->orderBy('a.created_at', 'DESC');
$query = $qb->getQuery();
$results = $query->getResult();
return $results;
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误:
[语法错误]第0行,第98行:错误:预期的Doctrine\ORM\Query\Lexer :: T_WITH,"开启"
编辑:我在join子句中用'WITH'替换'ON',现在我看到的只是加入列中的1个值.
Doctrine中fetch="EAGER"
和fetch="LAZY"
注释之间有什么区别@ManyToOne
?
/**
* @ManyToOne(targetEntity="Cart", cascade={"all"}, fetch="EAGER")
*/
/**
* @ManyToOne(targetEntity="Cart", cascade={"all"}, fetch="LAZY")
*/
Run Code Online (Sandbox Code Playgroud) 我在我的一个实体中有一个ManyToOne关系,如下所示:
class License {
// ...
/**
* Customer who owns the license
*
* @var \ISE\LicenseManagerBundle\Entity\Customer
* @ORM\ManyToOne(targetEntity="Customer", inversedBy="licenses")
* @ORM\JoinColumn(name="customer_id", referencedColumnName="id")
*/
private $customer;
// ...
}
class Customer {
// ...
/**
* Licenses that were at one point generated for the customer
*
* @var \Doctrine\Common\Collections\ArrayCollection
* @ORM\OneToMany(targetEntity="License", mappedBy="customer")
*/
private $licenses;
// ...
}
Run Code Online (Sandbox Code Playgroud)
这将生成一个数据库模式,其中允许许可证表的"customer_id"字段为空,这正是我不想要的.
这里是一些代码,我创建一个记录来证明它确实允许引用字段的空值:
$em = $this->get('doctrine')->getEntityManager();
$license = new License();
// Set some fields - not the reference fields though
$license->setValidUntil(new \DateTime("2012-12-31")); …
Run Code Online (Sandbox Code Playgroud) 我试图写一个查询(带子查询),但我不知道如何在我的子查询中设置限制.我的查询:
$query_ids = $this->getEntityManager()
->createQuery(
"SELECT e_.id
FROM MuzichCoreBundle:Element e_
WHERE [...]
GROUP BY e_.id")
->setMaxResults(5)
;
$query_select = "SELECT e
FROM MuzichCoreBundle:Element e
WHERE e.id IN (".$query_ids->getDql().")
ORDER BY e.created DESC, e.name DESC"
;
$query = $this->getEntityManager()
->createQuery($query_select)
->setParameters($params)
;
Run Code Online (Sandbox Code Playgroud)
但是- > setMaxResults(5)不起作用.SQL查询中没有'LIMIT'.我们可以用学说2做简单的限制吗?
我正在使用Symfony2和doctrine 2开发一个应用程序.我想知道如何获得当前登录用户的ID.
我会因为这个我没有得到解决的最小错误而疯狂.我想在两天之间选择条目,下面的例子说明了我所有的失败:
选择1.
$qb->where('e.fecha > ' . $monday->format('Y-m-d'));
$qb->andWhere('e.fecha < ' . $sunday->format('Y-m-d'));
Run Code Online (Sandbox Code Playgroud)
结果(0个条目):
SELECT r0_.id_reservacion AS id_reservacion0, r0_.fecha AS fecha1, r0_.cliente AS cliente2
FROM reservacion r0_
WHERE (r0_.fecha > 2012 - 07 - 16) AND (r0_.fecha < 2012 - 07 - 22)
Run Code Online (Sandbox Code Playgroud)
选择2
$qb->add('where', 'e.fecha between 2012-01-01 and 2012-10-10');
Run Code Online (Sandbox Code Playgroud)
结果(0个条目):
SELECT r0_.id_reservacion AS id_reservacion0, r0_.fecha AS fecha1, r0_.cliente AS cliente2
FROM reservacion r0_ WHERE r0_.fecha
BETWEEN 2012 - 01 - 01 AND 2012 - 10 - 10
Run Code Online (Sandbox Code Playgroud)
这是我当前条目的表格:
id fecha …
Run Code Online (Sandbox Code Playgroud) doctrine-orm ×10
php ×5
symfony ×4
orm ×2
between ×1
date ×1
dql ×1
many-to-many ×1
many-to-one ×1
pagination ×1
relationship ×1
soa ×1