好的,我有这个代码:
SELECT
IFNULL(s2.id,s1.id) AS effectiveID,
IFNULL(s2.status, s1.status) AS effectiveStatus,
IFNULL(s2.user_id, s1.user_id) as effectiveUser,
IFNULL(s2.likes_count, s1.likes_count) as effectiveLikesCount
FROM statuses AS s1
LEFT JOIN statuses AS s2 ON s2.id = s1.shared_from_id
WHERE s1.user_id = 4310
ORDER BY effectiveID DESC
LIMIT 15
Run Code Online (Sandbox Code Playgroud)
我需要将它重写为querybuilder.那样的东西?
$fields = array('IFNULL(s2.id,s1.id) AS effectiveID','IFNULL(s2.status, s1.status) AS effectiveStatus', 'IFNULL(s2.user_id, s1.user_id) as effectiveUser','IFNULL(s2.likes_count, s1.likes_count) as effectiveLikesCount');
$qb=$this->_em->createQueryBuilder()
->select($fields)
->from('WallBundle:Status','s1')
->addSelect('u')
->where('s1.user = :user')
->andWhere('s1.admin_status = false')
->andWhere('s1.typ_statusu != :group')
->setParameter('user', $user)
->setParameter('group', 'group')
->leftJoin('WallBundle:Status','s2', 'WITH', 's2.id=s1.shared_from_id')
->innerJoin('s1.user', 'u')
->orderBy('s1.time', 'DESC') …Run Code Online (Sandbox Code Playgroud) 我是laravel查询构建器的新手,我想搜索在输入字段中输入的多个单词,例如,如果我输入"jhon doe"我想要获取包含jhon或doe的任何列
我已经看过/尝试使用php MySQL的解决方案,但无法适应查询构建器
//1. exploding the space between the keywords
//2. using foreach apend the query together
$query = "select * from users where";
$keywordRaw = "jhon doe";
$keywords = explode(' ', $keywordRaw );
foreach ($keywords as $keyword){
$query.= " first_name LIKE '%" + $keyword +"%' OR ";
}
Run Code Online (Sandbox Code Playgroud)
如何使用查询生成器执行此操作
这就是我到目前为止,这样做的正确方法是什么,
$keywordRaw = "jhon doe";
//how do I explode this words and append them along with their appropriate query
$users = User::select('users.*')
->where('first_name', 'LIKE', '%'.$keywordRaw.'%')
Run Code Online (Sandbox Code Playgroud)
请帮助,提前谢谢
我有一个模型,文章,其中有很多摘要.我想加载10篇最新文章,并为每篇文章加载具有最高分数的摘要.我的功能看起来像这样:
public function getArticles($category, $viewName) {
$subArticles = $this->Articles->findByCategory($category)->contain([
'Abstracts' => function ($q) {
return $q
->select(['body', 'points', 'article_id'])
->where(['Abstracts.approved' => true])
->limit(10)
->order(['Abstracts.points' => 'DESC']);
}
])
->limit(10)
->order(['Articles.created' => 'DESC']) ;
$this->set( $viewName . 'Articles', $subArticles );
}
Run Code Online (Sandbox Code Playgroud)
我得到的结果不是我想要的.通过SQL,首先CakePHP获取了类别中所有内容的articles.id(很好).然后,CakePHP进入Abstracts表,使用那10篇文章.它刚刚找到,并要求获得最高票数的10篇摘要(属于那些文章).
问题是我希望每篇文章都有1篇摘要,而不是属于该类别任何文章的10篇摘要.我怎样才能解决这个问题?谢谢!
编辑
ndm建议这是对包含模型使用limit()的重复,所以我尝试了那里的解决方案.也就是说,我将此添加到我的模型中:
$this->hasOne('TopAbstract', [
'className' => 'Abstracts',
'foreignKey' => 'abstract_id',
'strategy' => 'select',
'sort' => ['TopAbstract.points' => 'DESC'],
'conditions' => function ($e, $query) {
$query->limit(1);
return $e;
} ]);
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用contains(['TopAbstract'])找到Articles byCategory,只有这会杀死我的SQL.它死于可怕的死亡:
Error: SQLSTATE[HY000]: General error: 1 …Run Code Online (Sandbox Code Playgroud) 我在使用javax.persistence.criteria.CriteriaBuilder创建查询时遇到问题.我正在使用EclipseLink 2.1和Oracle 10g数据库.在构建具有多个限制的查询时,它将仅使用第一个限制,而不是两个限制.
这是我的代码:
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Assignment> query = cb.createQuery(Assignment.class);
Root<Assignment> assignment = query.from(Assignment.class);
query.where(
cb.equal(assignment.get("request"), request),
cb.isNull(assignment.get("endDate")));
return getEm().createQuery(query).getResultList();
Run Code Online (Sandbox Code Playgroud)
生成的查询是:
SELECT ASSX_ID, END_DATE, BEGIN_DATE, COMMENTS,
ASSX_OER_ASSIGNED_TO_ID, OER_OER_ID_ASSIGNED_BY,
ASSX_RQST_ID
FROM TARTS.ASSIGNMENT_XREF
WHERE (ASSX_RQST_ID = ?)
Run Code Online (Sandbox Code Playgroud)
除了where子句外,它看起来不错.我期待:
SELECT ASSX_ID, END_DATE, BEGIN_DATE, COMMENTS,
ASSX_OER_ASSIGNED_TO_ID, OER_OER_ID_ASSIGNED_BY,
ASSX_RQST_ID FROM TARTS.ASSIGNMENT_XREF
WHERE (ASSX_RQST_ID = ? AND BEGIN_DATE IS NOT NULL)
Run Code Online (Sandbox Code Playgroud)
如果我使用cb.and(arg1,arg2)也没关系也没关系.难道我做错了什么?任何帮助将不胜感激.
在我的Symfony2存储库中,我想从调度表中获取已经启动但尚未完成的对象.对象内的区间应该是"未完成",应该作为变量传递.
使用纯SQL,它的工作方式如下:
SELECT * FROM slots rbs
WHERE rbs.rundate = '2012-08-13'
AND rbs.runtime <= '11:05:00'
AND '11:05:00' <= rbs.runtime + interval '300 seconds'
ORDER BY rbs.rundate DESC, rbs.runtime DESC
Run Code Online (Sandbox Code Playgroud)
我可以使用DQL/Query Builder实现相同的功能吗?
这是我到目前为止:
$qb = $this->createQueryBuilder('rbs');
$qb->where(
$qb->expr()->andX(
$qb->expr()->eq('rbs.rundate', ':date'),
$qb->expr()->lte('rbs.runtime', ':time'),
'rbs.runtime + interval 300 seconds >= :time'
)
)
->orderBy('rbs.rundate', 'DESC')
->addOrderBy('rbs.runtime', 'DESC')
->setParameter('date', date('Y-m-d'))
->setParameter('time', date('H:i:s'))
Run Code Online (Sandbox Code Playgroud)
但是这会返回以下错误:
[Doctrine\ORM\Query\QueryException]
[Syntax Error] line 0, col 139: Error: Expected =, <, <=, <>, >, >=, !=, got '300'
Run Code Online (Sandbox Code Playgroud)
我发现Doctrine2/DQL 不支持'interval',这也在 …
我有一个非常简单的实体(WpmMenu),它以自引用关系(称为adjecent list)保存相互连接的菜单项?所以在我的实体中我有:
protected $id
protected $parent_id
protected $level
protected $name
Run Code Online (Sandbox Code Playgroud)
与所有的getter/setter关系是:
/**
* @ORM\OneToMany(targetEntity="WpmMenu", mappedBy="parent")
*/
protected $children;
/**
* @ORM\ManyToOne(targetEntity="WpmMenu", inversedBy="children", fetch="LAZY")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onUpdate="CASCADE", onDelete="CASCADE")
*/
protected $parent;
public function __construct() {
$this->children = new ArrayCollection();
}
Run Code Online (Sandbox Code Playgroud)
一切正常.当我渲染菜单树时,我从存储库中获取根元素,获取其子元素,然后循环遍历每个子节点,获取其子节点并递归执行此操作,直到我渲染每个项目.
会发生什么(以及我正在寻求解决方案)是这样的:目前我有5个等级= 1个项目,并且每个项目都有3个等级= 2个项目附加(并且将来我将使用等级= 3个项目以及).要获取菜单树Doctrine的所有元素,请执行:
总计:22个查询
所以,我需要找到一个解决方案,理想情况下我想只有1个查询.
所以这就是我想要做的事情: 在我的实体存储库(WpmMenuRepository)中,我使用queryBuilder并获得按级别排序的所有菜单项的平面数组.获取根元素(WpmMenu)并从加载的元素数组中"手动"添加其子元素.然后递归地对孩子们这样做.这样做我可以拥有相同的树但只有一个查询.
所以这就是我所拥有的:
WpmMenuRepository:
public function setupTree() {
$qb = $this->createQueryBuilder("res");
/** @var Array */
$res = $qb->select("res")->orderBy('res.level', 'DESC')->addOrderBy('res.name','DESC')->getQuery()->getResult();
/** @var WpmMenu */
$treeRoot = …Run Code Online (Sandbox Code Playgroud) 我有这个查询,使用Laravel查询生成器:
$rows = DB::table('elements')->where('type', 1);
Run Code Online (Sandbox Code Playgroud)
这对应于:"SELECT*from elements WHERE type = 1"
现在,在某些情况下,我需要添加第二个创建查询的位置,如下所示:
SELECT * from elements WHERE type=1 AND lang='EN'
Run Code Online (Sandbox Code Playgroud)
使用经典php我会做类似的事情:
$sql = 'SELECT * from elements WHERE type=1';
if($var==true) $sql .= " AND lang='EN'";
Run Code Online (Sandbox Code Playgroud)
如何使用Laravel Query Builder执行此操作?
谢谢.
我有最简单的查询,我正在尝试运行
DB::table('user_visits')->groupBy('user_id')->count();
Run Code Online (Sandbox Code Playgroud)
但它返回了错误的数字,8.
如果我改成它:
count(DB::table('user_visits')->groupBy('user_id')->get());
Run Code Online (Sandbox Code Playgroud)
然后它返回正确的数字,34.为什么这些值不相同?
这是我的表格结构
user_visits( user_id, date_visited, num_clicks )
Run Code Online (Sandbox Code Playgroud) 我需要获得DATE(a.when)匹配字符串的所有行2014-09-30.
$builder = $this->em->createQueryBuilder();
$builder->select('a')
->from('Entity\Appointment', 'a')
->andWhere('a.when = :date')
->setParameter('date', $date);
Run Code Online (Sandbox Code Playgroud)
a.when是一个完整的DATETIME; :date只是一种string(DATE格式).
以下和变体不起作用:
->andWhere('DATE(a.when) = :date')
Error: Expected known function, got 'DATE'
Run Code Online (Sandbox Code Playgroud)
这里的正确用法是什么?
你如何在新的CakePHP中使用where子句?我尝试着:
$restaurants->find()->where(['id' => $r_ids])->all();
Run Code Online (Sandbox Code Playgroud)
$r_ids我的查询中需要的ID数组在哪里,但这不能按预期工作.
query-builder ×10
php ×4
doctrine ×3
symfony ×3
cakephp ×2
cakephp-3.0 ×2
doctrine-orm ×2
laravel ×2
laravel-4 ×2
mysql ×2
orm ×2
associations ×1
criteria ×1
date ×1
datetime ×1
eclipselink ×1
eloquent ×1
ifnull ×1
jpa-2.0 ×1
postgresql ×1
sql ×1