我有一个非常简单的实体(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) 我用一个查询在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"
我如何检查别名是否已定义?
没有办法检查这个.
这不起作用,因为我只有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)
我怎么能检查别名是否存在?
我正在用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) 我的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文档) ).
我在我的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)
我所有的凉亭组件都安装得当.
我究竟做错了什么?
我正在重构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) 我试图在laravel 5.1中使用hasManyThrough关系,但sql查询没有使用每个连接中为每个使用的模型定义的适当前缀.我有3个模型2其中使用相同的连接,其中一个使用不同的连接.连接之间的唯一区别是数据库的前缀相同.
关系:
B型内部:
public function relationshipWithA()
{
return $this->hasManyThrough(A::class, C::class, 'Cid', 'Aid');
}
Run Code Online (Sandbox Code Playgroud)
最终查询逻辑是正确的,但不是对连接表使用B_前缀,而是使用查询中所有表的A_前缀.
这是laravel的错误/限制吗?有没有解决方案,或者我必须手动加入以实现我想要的?
我是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,但结果是一样的.
有没有人有想法?
我有一个使用2个数据库的应用程序.我需要创建一个查询,将一个数据库中的表连接到另一个数据库表,但我不知道该怎么做.
所以,我有一个连接名称mysql和phc.我可以毫无问题地与两者沟通.
现在,我正在尝试执行此查询:
$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.
我怎么解决这个问题?
谢谢
query-builder ×10
php ×6
laravel ×4
mysql ×4
eloquent ×3
symfony ×3
doctrine ×2
doctrine-orm ×2
laravel-5 ×2
group-by ×1
html ×1
jquery ×1
orm ×1
parameters ×1
symfony-2.3 ×1