数据库查询构建器为在Laravel应用程序中创建和运行数据库查询提供了方便,流畅的界面。它可用于在您的应用程序中执行大多数数据库操作,并适用于所有受支持的数据库系统。
更新我的购物车模型时,我运行: $cart->transaction_id= $result->salePaymentRequestResult->token; $购物车->保存(); 这确实更新了我的购物车。但它具有不同的价值。为什么我的模组...
foreach($events_id 作为 $id){ $vis = $visitors->where('event_id', $id); array_push($men, $vis->where('性别', '男性')->count()); array_push($women, $vis->where('s...
Laravel Eloquent $model->save() 保存但具有不同的值
更新我的购物车模型时,我运行: $cart->transaction_id= $result->salePaymentRequestResult->token; $购物车->保存(); 这确实更新了我的购物车。但它具有不同的价值。为什么我的模式是...
使用查询生成器或 Eloquent 进行带有附加条件的 JOIN
我正在尝试使用 Laravel 查询生成器使用 JOIN 查询来添加条件。 我正在尝试使用 Laravel 查询生成器使用 JOIN 查询来添加条件。 <?php $results = DB::select(' SELECT DISTINCT * FROM rooms LEFT JOIN bookings ON rooms.id = bookings.room_type_id AND ( bookings.arrival between ? and ? OR bookings.departure between ? and ? ) WHERE bookings.room_type_id IS NULL LIMIT 20', array('2012-05-01', '2012-05-10', '2012-05-01', '2012-05-10') ); 我知道我可以使用原始表达式,但是这样就会出现 SQL 注入点。我已经使用查询生成器尝试了以下操作,但生成的查询(显然,查询结果)不是我想要的: $results = DB::table('rooms') ->distinct() ->leftJoin('bookings', function ($join) { $join->on('rooms.id', '=', 'bookings.room_type_id'); }) ->whereBetween('arrival', array('2012-05-01', '2012-05-10')) ->whereBetween('departure', array('2012-05-01', '2012-05-10')) ->where('bookings.room_type_id', '=', null) ->get(); 这是 Laravel 生成的查询: select distinct * from `room_type_info` left join `bookings` on `room_type_info`.`id` = `bookings`.`room_type_id` where `arrival` between ? and ? and `departure` between ? and ? and `bookings`.`room_type_id` is null 如您所见,查询输出没有结构(尤其是在 JOIN 范围下)。是否可以在 JOIN 下添加附加条件? 如何使用 Laravel 的查询生成器构建相同的查询(如果可能)使用 Eloquent 更好,还是应该保留 DB::select? $results = DB::table('rooms') ->distinct() ->leftJoin('bookings', function($join) { $join->on('rooms.id', '=', 'bookings.room_type_id'); $join->on('arrival','>=',DB::raw("'2012-05-01'")); $join->on('arrival','<=',DB::raw("'2012-05-10'")); $join->on('departure','>=',DB::raw("'2012-05-01'")); $join->on('departure','<=',DB::raw("'2012-05-10'")); }) ->where('bookings.room_type_id', '=', NULL) ->get(); 不太确定是否可以将 Between 子句添加到 Laravel 中的连接中。 备注: DB::raw() 指示 Laravel 不要放回引号。 通过将闭包传递给连接方法,您可以向其添加更多连接条件,on()将添加AND条件,orOn()将添加OR条件。 如果你有一些参数,你可以这样做。 $results = DB::table('rooms') ->distinct() ->leftJoin('bookings', function($join) use ($param1, $param2) { $join->on('rooms.id', '=', 'bookings.room_type_id'); $join->on('arrival','=',DB::raw("'".$param1."'")); $join->on('arrival','=',DB::raw("'".$param2."'")); }) ->where('bookings.room_type_id', '=', NULL) ->get(); 然后返回您的查询 返回$结果; 您可以在左连接中复制这些括号: LEFT JOIN bookings ON rooms.id = bookings.room_type_id AND ( bookings.arrival between ? and ? OR bookings.departure between ? and ? ) 是 ->leftJoin('bookings', function($join){ $join->on('rooms.id', '=', 'bookings.room_type_id'); $join->on(DB::raw('( bookings.arrival between ? and ? OR bookings.departure between ? and ? )'), DB::raw(''), DB::raw('')); }) 然后,您必须稍后使用“setBindings”设置绑定,如本 SO 帖子中所述: 如何将参数绑定到 Laravel 中用于模型的原始数据库查询? 虽然不漂亮,但很管用。 sql查询示例如下 LEFT JOIN bookings ON rooms.id = bookings.room_type_id AND (bookings.arrival = ? OR bookings.departure = ?) Laravel 具有多个条件的连接 ->leftJoin('bookings', function($join) use ($param1, $param2) { $join->on('rooms.id', '=', 'bookings.room_type_id'); $join->on(function($query) use ($param1, $param2) { $query->on('bookings.arrival', '=', $param1); $query->orOn('departure', '=',$param2); }); }) 我使用的是laravel5.2,我们可以添加不同选项的连接,您可以根据您的要求进行修改。 Option 1: DB::table('users') ->join('contacts', function ($join) { $join->on('users.id', '=', 'contacts.user_id')->orOn(...);//you add more joins here })// and you add more joins here ->get(); Option 2: $users = DB::table('users') ->join('contacts', 'users.id', '=', 'contacts.user_id') ->join('orders', 'users.id', '=', 'orders.user_id')// you may add more joins ->select('users.*', 'contacts.phone', 'orders.price') ->get(); option 3: $users = DB::table('users') ->leftJoin('posts', 'users.id', '=', 'posts.user_id') ->leftJoin('...', '...', '...', '...')// you may add more joins ->get(); 对于条件参数,我们可以使用 where, $results = DB::table('rooms') ->distinct() ->leftJoin('bookings', function($join) use ($param) { $join->on('rooms.id', '=', 'bookings.room_type_id') ->where('arrival','=', $param); }) ->where('bookings.room_type_id', '=', NULL) ->get(); 原始查询和标准选择之间存在差异(在 DB::raw 和 DB::select 方法之间)。 您可以使用 DB::select 做您想做的事情,然后简单地放入 ? 占位符,就像使用准备好的语句一样(这实际上就是它正在做的事情)。 一个小例子: $results = DB::select('SELECT * FROM user WHERE username=?', ['jason']); 第二个参数是一个值数组,用于从左到右替换查询中的占位符。 我的五美分计划左连接(..或..)和(..或..)和.. ->join('checks','checks.id','check_id') ->leftJoin('schema_risks', function (JoinClause $join) use($order_type_id, $check_group_id, $filial_id){ $join->on(function($join){ $join->on('schema_risks.check_method_id','=', 'check_id') ->orWhereNull('schema_risks.check_method_id') ; }) ->on(function($join) use ($order_type_id) { $join->where('schema_risks.order_type_id', $order_type_id) ->orWhereNull('schema_risks.order_type_id') ; }) ->on(function($join) use ($check_group_id) { $join->where('schema_risks.check_group_id', $check_group_id) ->orWhereNull('schema_risks.check_group_id') ; }) ->on(function($join) use($filial_id){ $join->whereNull('schema_risks.filial_id'); if ($filial_id){ $join->orWhere('schema_risks.filial_id', $filial_id); } }) ->on(function($join){ $join->whereNull('schema_risks.check_risk_level_id') ->orWhere('schema_risks.check_risk_level_id', '>' , CheckRiskLevel::CRL_NORMALLLY ); }) ; }) 新版本的提示: $rooms = Room::select('rooms.*', 'bookings.type3') ->join('bookings', function (JoinClause $join) { $join->on(['bookings.cat1' => 'rooms.cat1', 'bookings.cat2' => 'rooms.cat2']); })->get();; 除了使用两个 on 条件(AND 条件)之外,您还可以在其所有函数中使用 orOn() 条件,如 asBetween,... 这就是我解决问题的方法 - 我使用的是 Laravel 10.x,所以对于早期版本 YMMV。这用于获取当前付款期间的时间表 DB::table('DimDate') ->join('Settings', 'Settings_Key', DB::raw("'FirstPay'")) ->join('Timesheet', DB::raw('Timesheet_Date BETWEEN DATEADD(DAY, -13, DimDate_Date) AND DimDate_Date /*'), DB::raw('*/') ) ->where(DB::raw('DATEDIFF(DAY, Settings_Value_Date, DimDate_Date) % 14'), 0); 为了完成这项工作,我使用块注释来掩盖它为您添加的等号。结果(强调):
带有 ORDER BY 子句的 Laravel Eloquent 查询首先显示当天日期的记录,然后按另一列排序
我有一个非常简单的解决方案,但我不喜欢它。那么,我该怎么办? 我的数据库: -------------------------------------- id名称视图created_at -------------------------------------- 1 ...
如何使用 LIKE 关键字制作自定义 orderBy 或 DB::raw(FIELD()) 并在 laravel 查询生成器中传递变量
我有一个非常简单的解决方案,但我不喜欢它。那么,我该怎么办? 我的数据库是 -------------------------------------- id名称视图created_at -------------------------------------- 1...
在 Laravel 11 中的另一个多对多关系的数据透视表中获取一对多关系
我有一个具有多对多关系的地点、用户模型作为名为 Reservation 的数据透视表/模型,我需要在数据透视表和另一个名为
在原始查询中使用 WHERE IN/WHERE NOT IN 绑定数组参数
如何正确绑定原始查询的 NOT IN / IN 数组? 以下抛出数组到字符串转换错误: $user_list_to_exclude = [1, 2, 3]; $data = DB::select("SE...
Eloquent 的 Model::query() 是什么意思?
谁能详细解释一下 Eloquent 的 Model::query() 的含义吗?
所以这是我到目前为止构建的查询 $data['requested_units'] = RequestedUnit::with([ '用户', 'agent_warrants' => 函数 ($q) { $q->where('类型', RequestedUnit::
在 Laravel 8 中,如何将数据插入到 config/database.php 中配置的数据库中?
在 config/database.php (Laravel 8) 中进行配置: '连接' => [ '我的数据库' => [ '驱动程序' => 'mysql', '主机' => 'xx.xx.xxx.xxx', '端口' => '3306', ...
有一个MySQL“类别”表。 Category 模型具有如下所示的“hasMany”关系。 公共函数children(){ 返回 $this->hasMany(self::class...
在 laravel 中使用 allowedFilter() 来建立关系
你好,我正在尝试从关系表中过滤数据。 就像表一样 培训视频(表) -> 媒体(表) 代码就像 $a = QueryBuilder::for(TrainingVideo::class) ->with('成绩','
相当于 Laravel 查询生成器中的 FORCE INDEX FOR JOIN
我正在构建一个 Laravel 5.2 应用程序。我有一个本机 SQL 查询,需要转换为查询构建器形式,我的意思是,相当于 Laravel 查询构建器中的 SQL 查询。
“with”和“each”中的 Laravel 临时属性在一起
我正在尝试在查询生成器中使用 Laravel every 方法,但我在 every 方法中添加的属性不会保留到集合中。当我 dd($task); 时,我的属性确实显示
我有一张桌子组织。该表有一个主 ID(int 10,无符号,AUTO_INCRMENT)。 在组织表中,我还有一个指向 self 的外键:main_organization_id。这有
有3个不同的数据库表文章、评论、帖子,它们都有这些列:'id','title','user_id','created_at','body'。 我正在使用 Laravel 5.6 和 yajra/laravel-datatables
将 Laravel 查询生成器与 Between 和 GETDATE 结合使用
我试图了解如何使用查询生成器创建查询并具有类似的 where 值 其中项目=1 日期 1 和日期 2 之间的 GETDATE() 谢谢。
我正在尝试在类似于下面示例的上下文中使用 Laravel 查询生成器将子查询加入到主查询中。我假设主查询会通过指定
SQLSTATE[42S22]:找不到列:1054“where 子句错误”中的未知列“nim1”
运行更新功能时我的代码将无法运行。 控制器 公共功能更新(请求$请求,Mahasiswa $mahasiswa) { $validatedata = $request->validate([ 'nim' => '是...