标签: query-builder

symfony2 doctrine选择IFNULL

好的,我有这个代码:

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)

doctrine query-builder ifnull symfony

11
推荐指数
1
解决办法
1万
查看次数

laravel搜索由空格分隔的多个单词

我是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)

请帮助,提前谢谢

php mysql query-builder laravel eloquent

11
推荐指数
1
解决办法
1万
查看次数

如何限制每个记录/组的包含关联?

我有一个模型,文章,其中有很多摘要.我想加载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)

orm cakephp associations query-builder cakephp-3.0

10
推荐指数
1
解决办法
5168
查看次数

Jpa QueryBuilder where子句中的多个表达式不起作用

我在使用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)也没关系也没关系.难道我做错了什么?任何帮助将不胜感激.

criteria eclipselink query-builder jpa-2.0

9
推荐指数
1
解决办法
1万
查看次数

如何在Doctrine2 Query Builder中使用'interval'

在我的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',这也在 …

php postgresql query-builder symfony doctrine-orm

9
推荐指数
3
解决办法
1万
查看次数

Doctrine - 自引用实体 - 禁用获取子项

我有一个非常简单的实体(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的所有元素,请执行:

  • 1查询根元素+
  • 1个查询以获取5个子元素(level = 1)的根元素+
  • 5个查询以获得每个级别1项目的3个孩子(级别= 2)+
  • 15个查询(5x3)以获取每个级别2项的子项(级别= 3)

总计: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)

php orm doctrine query-builder symfony

9
推荐指数
1
解决办法
8582
查看次数

Laravel:如何使用查询构建器添加where子句?

我有这个查询,使用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执行此操作?

谢谢.

php mysql sql query-builder laravel-4

9
推荐指数
1
解决办法
2万
查看次数

DB-> count()从count返回不同的值(DB-> get())

我有最简单的查询,我正在尝试运行

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)

query-builder laravel laravel-4

9
推荐指数
1
解决办法
5万
查看次数

在Doctrine Querybuilder中使用`DATE()`

我需要获得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)

这里的正确用法是什么?

datetime doctrine date query-builder doctrine-orm

9
推荐指数
2
解决办法
2万
查看次数

如何在CakePHP查询中创建`IN`子句?

你如何在新的CakePHP中使用where子句?我尝试着:

$restaurants->find()->where(['id' => $r_ids])->all();
Run Code Online (Sandbox Code Playgroud)

$r_ids我的查询中需要的ID数组在哪里,但这不能按预期工作.

cakephp query-builder cakephp-3.0

9
推荐指数
1
解决办法
1万
查看次数