标签: query-builder

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 4,雄辩 - 声明和运营商之间

我用一个查询在mysql中运行:

select * from my_table where $val between col1 and coL2;
Run Code Online (Sandbox Code Playgroud)

它运行正常,但是使用laravel 4,进行查询的唯一方法就是使用类似的东西

my_model::where('col1','>=',$val)->where('col2','<=',$val)
Run Code Online (Sandbox Code Playgroud)

这种方式似乎不起作用,因为在使用通常的"select*..."时我没有相同的结果

任何的想法 ?

只是为了澄清我的要求:在我的情况下,我没有"...在value1和value2之间的列",但"在commun之间的值"所以在我看来,我不能使用"wherebetween"

php mysql query-builder laravel eloquent

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

检查是否存在别名?

我如何检查别名是否已定义?

没有办法检查这个.

这不起作用,因为我只有ROOT别名,没有连接别名.

/** @var $query \Doctrine\ORM\QueryBuilder */
$query->getRootAliases()
Run Code Online (Sandbox Code Playgroud)

这些部件对我来说是另一个无效的选择......

$query->getDQLPart()
Run Code Online (Sandbox Code Playgroud)

仅返回"select,from等"部分.

那就是我会"忽略"的错误.

[Semantical Error] line 0, col 254 near '_user LEFT': Error: '_user' is already defined.
Run Code Online (Sandbox Code Playgroud)

我怎么能检查别名是否存在?

doctrine query-builder symfony doctrine-orm symfony-2.3

8
推荐指数
2
解决办法
5257
查看次数

Laravel查询构建器返回对象或数组?

我正在用Laravel构建一个非常简单的Web应用程序.

我已经构建了两个独立的控制器,每个控制器返回两个单独的视图,如下所示:

ProfileController可:

class ProfileController extends BaseController {

    public function user($name)
    {
        $user = User::where('name', '=', $name);

        if ($user->count())
        {
            $user = $user->first();
            $workout = DB::table('workouts')->where('user_id', '=', $user->id)->get();

            Return View::make('profile')
                    ->with('user', $user)
                    ->with('workout', $workout);
        }

        return App::abort(404);
    }
}
Run Code Online (Sandbox Code Playgroud)

WorkoutController:

class WorkoutController extends BaseController {

    public function workout($name)
    {
        $workout = DB::table('workouts')->where('name', '=', $name)->first();

        if ($workout)
        {
            Return View::make('add-exercise')
                    ->with('workout', $workout);
        }

        return App::abort(404);
    }
}
Run Code Online (Sandbox Code Playgroud)

令我困惑的是我为了将单个workout对象传递给每个视图而必须做的事情.您可能已经注意到查询构建器workout是不同的:

$workout = DB::table('workouts')->where('user_id', '=', $user->id)->get();
Run Code Online (Sandbox Code Playgroud)

$workout = DB::table('workouts')->where('name', …
Run Code Online (Sandbox Code Playgroud)

php query-builder laravel eloquent

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

Laravel查询构建器 - 如何按别名分组,或执行原始groupBy

我的Laravel 5应用程序包含一个用于报告运行的动态查询构建器.我需要一些group by子句,并遇到了问题.如果我在那里使用实际的sql我可能会遇到问题,因为有时需要在sql中使用sql命令(而不是简单的列名),即 - DAYNAME(table_name.date_column).Laravel破坏了这个:

\`DAYNAME(table_name\`.\`date_column)\`
Run Code Online (Sandbox Code Playgroud)

对于我的查询的选择部分,我可以使用selectRaw,但似乎没有相似的group by.

我想过使用别名(所有的选择都是别名),但是Laravel也用"`"字符包装它们.此外 - 我的应用程序需要与MySQL和SQL Server一起使用,据我所知,后者不允许在查询的组中使用别名.

我可以在Illuminate\Database\Query\Grammars\Grammar中找到编译group by的方法(compileGroups),我想我可以覆盖它,但我不太清楚我会怎么做(已阅读Laravel文档) ).

mysql group-by query-builder laravel laravel-5

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

JQuery QueryBuilder无法正常工作

我在我的HTML页面中使用JQuery QueryBuilder.我已按照安装指南进行操作.我的HTML头包括以下内容

    <script src="bower_components/jquery/dist/jquery.min.js"></script>
    <script src="bower_components/bootstrap/dist/js/bootstrap.js"></script>
    <script src="bower_components/moment/moment.js"></script>
    <script src="bower_components/jquery-extendext/jQuery.extendext.js"></script>
    <link href="bower_components/bootstrap/dist/css/bootstrap.css" rel="stylesheet" type="text/css" />
    <link href="bower_components/jQuery-QueryBuilder/dist/css/query-builder.default.css" rel="stylesheet" type="text/css" />
    <script src="bower_components/jQuery-QueryBuilder/dist/js/query-builder.standalone.js"></script>
Run Code Online (Sandbox Code Playgroud)

我的身体有

<div id="builder"></div>
Run Code Online (Sandbox Code Playgroud)

但是当我使用时

<script>
  $('#builder').queryBuilder({
    filters: [ ... ]
  });
</script>
Run Code Online (Sandbox Code Playgroud)

我的Chrome控制台说

query-builder.standalone.js:437 Uncaught TypeError: Cannot set property 'queryBuilder' of undefined
Run Code Online (Sandbox Code Playgroud)

我所有的凉亭组件都安装得当.

我究竟做错了什么?

html jquery query-builder

8
推荐指数
1
解决办法
4034
查看次数

使用doctrine 2 DBAL加入子查询

我正在重构Zend Framework 2应用程序以使用doctrine 2.5 DBAL而不是Zend_DB(ZF1).我有以下Zend_Db查询:

$subSelect = $db->select()
    ->from('user_survey_status_entries', array('userSurveyID', 'timestamp' => 'MIN(timestamp)'))
    ->where('status = ?', UserSurveyStatus::ACCESSED)
    ->group('userSurveyID');


$select = $db->select()
    // $selectColNames contains columns both from the main query and 
    // the subquery (e.g. firstAccess.timestamp AS dateFirstAccess).
    ->from(array('us' => 'user_surveys'), $selectColNames)
    ->joinLeft(array('firstAccess' => $subSelect), 'us.userSurveyID = firstAccess.userSurveyID', array())
    ->where('us.surveyID = ?', $surveyID);
Run Code Online (Sandbox Code Playgroud)

这导致以下MySQL查询:

SELECT `us`.`userSurveyID`, 
    // More columns from main query `us`
    `firstAccess`.`timestamp` AS `dateFirstAccess`
FROM `user_surveys` AS `us`
LEFT JOIN (
    SELECT `user_survey_status_entries`.`userSurveyID`, 
            MIN(timestamp) AS `timestamp` 
    FROM …
Run Code Online (Sandbox Code Playgroud)

php mysql query-builder doctrine-orm zend-framework2

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

在laravel 5.1中使用hasManyThrough关系的模型的不同数据库连接

我试图在laravel 5.1中使用hasManyThrough关系,但sql查询没有使用每个连接中为每个使用的模型定义的适当前缀.我有3个模型2其中使用相同的连接,其中一个使用不同的连接.连接之间的唯一区别是数据库的前缀相同.

  • 模型A具有使用前缀A_的连接A.
  • 模型B有连接B,它使用前缀B_
  • 模型C有连接B,它使用前缀B_

关系:

B型内部:

public function relationshipWithA()
{
    return $this->hasManyThrough(A::class, C::class, 'Cid', 'Aid');
}
Run Code Online (Sandbox Code Playgroud)

最终查询逻辑是正确的,但不是对连接表使用B_前缀,而是使用查询中所有表的A_前缀.

这是laravel的错误/限制吗?有没有解决方案,或者我必须手动加入以实现我想要的?

php mysql query-builder eloquent laravel-5

8
推荐指数
1
解决办法
1003
查看次数

Symfony 3参数太多

我是Symfony的新手,在运行查询时遇到错误:

public function getFilteredArticles($page, $nbPerPage, $data) {
        $query = $this->createQueryBuilder('a')
                ->leftJoin('a.images', 'i')
                ->addSelect('i')
                ->leftJoin('a.type_stockage', 't')
                ->addSelect('t')
                ->leftJoin('a.famille', 'f')
                ->addSelect('f');
        if ($data['famille'] != '') {
            $query->where('f.id = :famille')
                    ->setParameter('famille', $data['famille']);
        }
        if ($data['rds'] == false) {
            $query->where('a.stock_actuel > 0');
        }
        if ($data['recherche'] != '' && $data['recherche'] != null) {
            $query->where('a.ref_article LIKE :recherche')
                    ->setParameter('recherche', '%' . $data['recherche'] . '%');
        }
        $query->leftJoin('a.sousfamille', 's')
                ->orderBy('a.ref_article', 'ASC')
                ->getQuery();

        $query->setFirstResult(($page - 1) * $nbPerPage)
                ->setMaxResults($nbPerPage);

        return new Paginator($query, true);
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,此查询具有条件参数,它返回表所需的文章列表.但是,当我运行此查询来填充我的表时,我得到了错误:

在渲染模板期间抛出异常("太多参数:查询定义0个参数,你绑定1").

我不知道他为什么期待0个参数.我尝试使用setParameters,但结果是一样的.

有没有人有想法?

parameters query-builder symfony

8
推荐指数
1
解决办法
7677
查看次数

Laravel - 如何从不同的数据库连接加入2个表?

我有一个使用2个数据库的应用程序.我需要创建一个查询,将一个数据库中的表连接到另一个数据库表,但我不知道该怎么做.

所以,我有一个连接名称mysqlphc.我可以毫无问题地与两者沟通.

现在,我正在尝试执行此查询:

$artigos = DB::connection('phc')->table('st')
        ->join('mysql.cart', 'mysql.cart.id_item', '=', 'st.ststamp')
        ->select('st.ststamp', 'st.ref', 'st.design', 'st.imagem', 'mysql.cart.qtt')
        ->where('mysql.carts.id_user','=',Auth::id())
        ->paginate(10);
Run Code Online (Sandbox Code Playgroud)

但是回报我: General error: 20018 Invalid object name 'mysql.cart'

我想访问连接mysql表购物车和连接phc表st.

我怎么解决这个问题?

谢谢

php query-builder laravel laravel-query-builder

8
推荐指数
1
解决办法
1090
查看次数