쿼리 빌더
ㅋㅋ 결과
- Native 표현식
- Joins
- Where Exists 구문
- JSON Where 구문
- 순서, 그룹화, 제한 및 오프셋
- 조건문
- 삭제
- 비관적 잠금
소개
Laravel의 데이터베이스 쿼리 빌더는 데이터베이스 쿼리를 생성하고 실행하기 위한 편리한 인터페이스를 제공합니다. 이는 애플리케이션에서 대부분의 데이터베이스 작업을 수행하는 데 사용할 수 있으며 지원되는 모든 데이터베이스 시스템에서 실행됩니다.
Laravel의 쿼리 빌더는 PDO 매개변수 바인딩을 사용하여 SQL 주입 공격으로부터 애플리케이션을 보호합니다. 따라서 바인딩으로 전달된 문자열을 정리할 필요가 없습니다.
결과 가져오기
데이터 테이블에서 모든 행 가져오기
DB
facade
코드에서table을 사용할 수 있습니다. > 쿼리를 시작하는 방법입니다.
table
메서드는 지정된 테이블에 대한 쿼리 빌더 인스턴스를 반환하므로 쿼리에 더 많은 제약 조건을 연결하고 마지막으로get
메서드를 사용하여 결과를 얻을 수 있습니다.DB
facade
上使用table
方法来开始查询。该table
方法为给定的表返回一个查询构造器实例,允许你在查询上链式调用更多的约束,最后使用get
方法获取结果:<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\DB; use App\Http\Controllers\Controller; class UserController extends Controller{ /** * 显示所有应用程序的用户列表。 * * @return Response */ public function index() { $users = DB::table('users')->get(); return view('user.index', ['users' => $users]); } }
该
get
方法返回一个包含IlluminateSupportCollection
的结果,其中每个结果都是PHP
StdClass
对象的一个实例。你可以访问字段作为对象的属性来访问每列的值:foreach ($users as $user) { echo $user->name; }
从数据表中获取单行或单列
如果你只需要从数据表中获取一行数据,你可以使用
first
方法。该方法返回一个StdClass
对象:$user = DB::table('users')->where('name', 'John')->first(); echo $user->name;
如果你甚至不需要整行数据,则可以使用
value
方法从记录中获取单个值。该方法将直接返回该字段的值:$email = DB::table('users')->where('name', 'John')->value('email');
获取一列的值
如果你想获取包含单列值的集合,则可以使用
pluck
$titles = DB::table('roles')->pluck('title'); foreach ($titles as $title) { echo $title; }
Theget
메소드는 각PHP
StdClass
객체인IlluminateSupportCollection
을 포함하는 결과를 반환합니다. 개체의 속성으로 필드에 액세스하여 각 열의 값에 액세스할 수 있습니다.$roles = DB::table('roles')->pluck('title', 'name'); foreach ($roles as $name => $title) { echo $title; }
데이터 테이블에서 단일 행 또는 열 가져오기If 데이터 테이블에서 단일 행이나 열만 가져오면 됩니다. 테이블에서 데이터 행을 가져오려면
first
메서드를 사용할 수 있습니다. 이 메소드는StdClass
객체를 반환합니다.DB::table('users')->orderBy('id')->chunk(100, function ($users) { foreach ($users as $user) { // } });
전체 데이터 행이 필요하지 않은 경우value
메소드를 사용하여 기록. 이 메소드는 필드 값을 직접 반환합니다.DB::table('users')->orderBy('id')->chunk(100, function ($users) { // Process the records... return false; });
🎜🎜열 값 가져오기🎜🎜단일 열 값이 포함된 컬렉션을 가져오려는 경우 ,pluck
방법을 사용할 수 있습니다. 다음 예에서는 역할 테이블에 제목 컬렉션을 가져옵니다. 🎜DB::table('users')->where('active', false) ->chunkById(100, function ($users) { foreach ($users as $user) { DB::table('users') ->where('id', $user->id) ->update(['active' => true]); } });
🎜 반환된 컬렉션의 필드에 대해 사용자 정의 키 값을 지정할 수도 있습니다. 🎜$users = DB::table('users')->count(); $price = DB::table('orders')->max('price');
🎜🎜🎜🎜🎜🎜청크 결과
수천 개의 데이터베이스 레코드를 처리해야 하는 경우
chunk
방법 사용을 고려할 수 있습니다. 이 메서드는 한 번에 결과 집합의 작은 부분을 가져와 처리를 위해클로저
함수에 전달합니다. 이 방법은 수천 개의 데이터를 처리하기 위해 Artisan 명령어를 작성할 때 유용합니다. 예를 들어, 전체users
테이블 데이터를 한 번에 100개의 레코드를 처리하는 작은 조각으로 잘라낼 수 있습니다.chunk
方法。该方法一次获取结果集的一小块,并将其传递给闭包
函数进行处理。该方法在 Artisan 命令 编写数千条处理数据的时候非常有用。例如,我们可以将全部users
表数据切割成一次处理 100 条记录的一小块:$price = DB::table('orders') ->where('finalized', 1) ->avg('price');
你可以通过在
闭包
中返回false
来终止继续获取分块结果:return DB::table('orders')->where('finalized', 1)->exists(); return DB::table('orders')->where('finalized', 1)->doesntExist();
如果要在分块结果时更新数据库记录,则块结果可能会和预计的返回结果不一致。 因此,在分块更新记录时,最好使用
chunkById
方法。 此方法将根据记录的主键自动对结果进行分页:$users = DB::table('users')->select('name', 'email as user_email')->get();
{提示} 在块的回调里面更新或删除记录时,对主键或外键的任何更改都可能影响块查询。 这可能会导致记录没有包含在分块结果中。
聚合
查询构造器还提供了各种聚合方法,比如
count
,max
,min
,avg
,还有sum
。你可以在构造查询后调用任何方法:$users = DB::table('users')->distinct()->get();
当然,你也可以将这些聚合方法与其他的查询语句相结合:
$query = DB::table('users')->select('name'); $users = $query->addSelect('age')->get();
判断记录是否存在
除了通过
count
方法可以确定查询条件的结果是否存在之外,还可以使用exists
和doesntExist
方法:$users = DB::table('users') ->select(DB::raw('count(*) as user_count, status')) ->where('status', '<>', 1) ->groupBy('status') ->get();
Selects
指定一个 Select 语句
当然你可能并不总是希望从数据库表中获取所有列。使用
select
方法,你可以自定义一个select
查询语句来查询指定的字段:$orders = DB::table('orders') ->selectRaw('price * ? as price_with_tax', [1.0825]) ->get();
distinct
方法会强制让查询返回的结果不重复:$orders = DB::table('orders') ->whereRaw('price > IF(state = "TX", ?, 100)', [200]) ->get();
如果你已经有了一个查询构造器实例,并且希望在现有的查询语句中加入一个字段,那么你可以使用
addSelect
方法:$orders = DB::table('orders') ->select('department', DB::raw('SUM(price) as total_sales')) ->groupBy('department') ->havingRaw('SUM(price) > ?', [2500]) ->get();
原生表达式
有时候你可能需要在查询中使用原生表达式。你可以使用
DB::raw
创建一个原生表达式:$orders = DB::table('orders') ->orderByRaw('updated_at - created_at DESC') ->get();
{提示} 原生表达式将会被当做字符串注入到查询中,因此你应该小心使用,避免创建 SQL 注入的漏洞。
原生方法
可以使用以下方法代替
DB::raw
$users = DB::table('users') ->join('contacts', 'users.id', '=', 'contacts.user_id') ->join('orders', 'users.id', '=', 'orders.user_id') ->select('users.*', 'contacts.phone', 'orders.price') ->get();
클로저<에서
false를 반환하여 이를 수행할 수 있습니다. /code>
청크된 결과의 지속적인 획득을 종료하려면:결과를 청크할 때 데이터베이스 레코드를 업데이트하려는 경우 청크된 결과가 예상 반환 결과와 일치하지 않을 수 있습니다. 따라서 청크 단위로 레코드를 업데이트할 때는$users = DB::table('users') ->leftJoin('posts', 'users.id', '=', 'posts.user_id') ->get(); $users = DB::table('users') ->rightJoin('posts', 'users.id', '=', 'posts.user_id') ->get();
chunkById
메서드를 사용하는 것이 가장 좋습니다. 이 방법은 레코드의 기본 키를 기준으로 결과를 자동으로 페이지 매깁니다. 🎜$users = DB::table('sizes') ->crossJoin('colours') ->get();
🎜{Tip} 블록의 콜백 내에서 레코드를 업데이트하거나 삭제할 때 기본 키 또는 외래 키에 대한 변경 사항이 블록 쿼리에 영향을 미칠 수 있습니다. 이로 인해 레코드가 청크 결과에 포함되지 않을 수 있습니다. 🎜
🎜🎜🎜🎜Aggregation🎜🎜쿼리 빌더는 다양한 집계 방법도 제공합니다. 예를 들어 ,count
,max
,min
,avg
및sum
. 쿼리를 구성한 후에는 어떤 메서드든 호출할 수 있습니다. 🎜DB::table('users') ->join('contacts', function ($join) { $join->on('users.id', '=', 'contacts.user_id')->orOn(...); }) ->get();
🎜 물론 이러한 집계 메서드를 다른 쿼리 문과 결합할 수도 있습니다. 🎜DB::table('users') ->join('contacts', function ($join) { $join->on('users.id', '=', 'contacts.user_id') ->where('contacts.user_id', '>', 5); }) ->get();
🎜Determine 레코드 존재 여부
🎜쿼리 조건의 결과가 존재하는지 확인하기 위해count
메서드를 사용하는 것 외에도exists
및를 사용할 수도 있습니다. 존재하지 않음 code> 메서드: 🎜
$latestPosts = DB::table('posts') ->select('user_id', DB::raw('MAX(created_at) as last_post_created_at')) ->where('is_published', true) ->groupBy('user_id');$users = DB::table('users') ->joinSub($latestPosts, 'latest_posts', function($join) { $join->on('users.id', '=', 'latest_posts.user_id'); }) ->get();
🎜🎜🎜선택
🎜Select 문 지정
🎜물론, 항상 데이터베이스 테이블에서 모든 열을 가져오고 싶지는 않을 수도 있습니다.select
메서드를 사용하면select
쿼리 문을 사용자 정의하여 지정된 필드를 쿼리할 수 있습니다. 🎜$first = DB::table('users') ->whereNull('first_name');$users = DB::table('users') ->whereNull('last_name') ->union($first) ->get();
🎜distinct
메서드는 쿼리를 강제로 return 결과가 중복되지 않습니다. 🎜$users = DB::table('users')->where('votes', '=', 100)->get();
🎜 쿼리 빌더 인스턴스가 이미 있고 기존 쿼리 문에 필드를 추가하려는 경우addSelect
메서드를 사용할 수 있습니다. 🎜$users = DB::table('users')->where('votes', 100)->get();
🎜🎜🎜원시 표현식
🎜때때로 쿼리 표현식에 원시 표현식을 사용해야 할 수도 있습니다. .DB::raw
를 사용하여 원시 표현식을 만들 수 있습니다. 🎜$users = DB::table('users') ->where('votes', '>=', 100) ->get();$users = DB::table('users') ->where('votes', '<>', 100) ->get();$users = DB::table('users') ->where('name', 'like', 'T%') ->get();
🎜{Tip} 원시 표현식은 쿼리에 문자열로 삽입되므로 주의해서 사용해야 합니다. SQL 주입 취약점을 생성합니다. 🎜
🎜🎜🎜🎜네이티브 메서드🎜🎜대신 다음 메서드를 사용할 수 있습니다.DB::raw
는 쿼리의 다양한 부분에 원시 표현식을 삽입합니다. 🎜🎜🎜selectRaw
selectRaw
selectRaw
方法可以代替select(DB::raw(...))
。该方法的第二个参数是可选项,值是一个绑定参数的数组:$users = DB::table('users')->where([ ['status', '=', '1'], ['subscribed', '<>', '1'], ])->get();
whereRaw / orWhereRaw
whereRaw
和orWhereRaw
方法将原生的where
注入到你的查询中。这两个方法的第二个参数还是可选项,值还是绑定参数的数组:$users = DB::table('users') ->where('votes', '>', 100) ->orWhere('name', 'John') ->get();
havingRaw / orHavingRaw
havingRaw
和orHavingRaw
方法可以用于将原生字符串设置为having
语句的值:$users = DB::table('users') ->whereBetween('votes', [1, 100])->get();
orderByRaw
orderByRaw
方法可用于将原生字符串设置为order by
子句的值:$users = DB::table('users') ->whereNotBetween('votes', [1, 100]) ->get();
Joins
Inner Join Clause
查询构造器也可以编写
join
方法。若要执行基本的
「内链接」,你可以在查询构造器实例上使用join
方法。传递给join
方法的第一个参数是你需要连接的表的名称,而其他参数则使用指定连接的字段约束。你还可以在单个查询中连接多个数据表:$users = DB::table('users') ->whereIn('id', [1, 2, 3]) ->get();
Left Join 语句
如果你想使用 「左连接」或者 「右连接」代替「内连接」 ,可以使用
leftJoin
或者rightJoin
方法。这两个方法与join
方法用法相同:$users = DB::table('users') ->whereNotIn('id', [1, 2, 3]) ->get();
Cross Join 语句
使用
crossJoin
方法和你想要连接的表名做 「交叉连接」。交叉连接在第一个表和被连接的表之间会生成笛卡尔积:$users = DB::table('users') ->whereNull('updated_at') ->get();
高级 Join 语句
你可以指定更高级的 join 语句。比如传递一个
闭包
作为join
方法的第二个参数。此闭包
接收一个JoinClause
对象,从而指定join
语句中指定的约束:$users = DB::table('users') ->whereNotNull('updated_at') ->get();
如果你想要在连接上使用「where」 风格的语句,你可以在连接上使用
where
和orWhere
方法。这些方法会将列和值进行比较,而不是列和列进行比较:$users = DB::table('users') ->whereDate('created_at', '2018-09-08') ->get();
子连接查询
你可以使用
joinSub
,leftJoinSub
和rightJoinSub
selectRaw
메서드는select(DB::raw(...))
를 대체할 수 있습니다. 이 메서드의 두 번째 매개변수는 선택사항이며 값은 바인딩된 매개변수의 배열입니다:$users = DB::table('users') ->whereMonth('created_at', '9') ->get();
whereRaw / orWhereRaw
< / h4>whereRaw
및orWhereRaw
메서드는 쿼리에 기본where
를 삽입합니다. 이 두 메서드의 두 번째 매개변수는 여전히 선택사항이며 값은 여전히 바인딩된 매개변수의 배열입니다.$users = DB::table('users') ->whereDay('created_at', '8') ->get();
havingRaw / orHavingRaw
🎜havingRaw
및orHavingRaw
메소드를 사용하여 원시 문자열을having
문의 값으로 설정할 수 있습니다: 🎜$users = DB::table('users') ->whereYear('created_at', '2018') ->get();
< div name= "db09f9" data-unique="db09f9">🎜🎜orderByRaw
🎜orderByRaw
메소드를 사용하여 원시 문자열을로 설정할 수 있습니다. order by 코드 값> 절: 🎜
$users = DB::table('users') ->whereTime('created_at', '=', '11:20:45') ->get();
🎜🎜🎜🎜Joins
🎜🎜내부 조인 절🎜쿼리 빌더는join
메서드를 작성할 수도 있습니다. 기본
"내부 연결"을 수행하려면 쿼리 빌더 인스턴스에서join
메소드를 사용할 수 있습니다.join
메소드에 전달된 첫 번째 매개변수는 조인하려는 테이블의 이름이고, 다른 매개변수는 조인을 지정하는 필드 제약 조건을 사용합니다. 단일 쿼리로 여러 데이터 테이블을 조인할 수도 있습니다: 🎜$users = DB::table('users') ->whereColumn('first_name', 'last_name') ->get();
🎜🎜Left Join 문🎜"left Join" 또는 " "내부 조인" 대신 "오른쪽 조인"을 사용하면leftJoin
또는rightJoin
메서드를 사용할 수 있습니다. 이 두 가지 방법은join
방법과 동일하게 사용됩니다: 🎜$users = DB::table('users') ->whereColumn('updated_at', '>', 'created_at') ->get();
🎜🎜Cross Join 문🎜사용 crossJoin< /code> 메소드와 "교차 연결"을 수행하기 위해 연결하려는 테이블의 이름입니다. 교차 조인은 첫 번째 테이블과 조인된 테이블 사이에 데카르트 곱을 생성합니다. 🎜
$users = DB::table('users') ->whereColumn([ ['first_name', '=', 'last_name'], ['updated_at', '>', 'created_at'] ])->get();
🎜🎜고급 조인 문🎜지정할 수 있습니다. 더 고급 조인 진술. 예를 들어join
메소드의 두 번째 매개변수로클로저
를 전달합니다. 이Closure
는JoinClause
개체를 수신하여join
문에 지정된 제약 조건을 지정합니다. 🎜DB::table('users') ->where('name', '=', 'John') ->where(function ($query) { $query->where('votes', '>', 100) ->orWhere('title', '=', 'Admin'); }) ->get();
🎜원하는 경우 연결에 "where" 스타일 문을 사용하면 연결에where
및orWhere
메서드를 사용할 수 있습니다. 이러한 방법은 열과 열이 아닌 열과 값을 비교합니다. 🎜select * from users where name = 'John' and (votes > 100 or title = 'Admin')
🎜🎜Subjoin 쿼리🎜joinSub
,leftJoinSub
및rightJoinSub
메서드는 쿼리를 하위 쿼리로 결합합니다. 각 메소드는 하위 쿼리, 테이블 별칭, 관련 필드를 정의하는 클로저라는 세 가지 매개변수를 받습니다.Unions
쿼리 빌더는 두 쿼리를 "통합"하는 바로가기도 제공합니다. 예를 들어 먼저 쿼리를 만든 다음
union
메서드를 사용하여 두 번째 쿼리와 통합할 수 있습니다.union
方法将其和第二个查询进行联合:DB::table('users') ->whereExists(function ($query) { $query->select(DB::raw(1)) ->from('orders') ->whereRaw('orders.user_id = users.id'); }) ->get();
{提示} 你也可以使用
unionAll
方法,用法union
方法是的一样。Where 语句
简单的 Where 语句
在构造
where
查询实例的中,你可以使用where
方法。调用where
最基本的方式是需要传递三个参数:第一个参数是列名,第二个参数是任意一个数据库系统支持的运算符,第三个是该列要比较的值。例如,下面是一个要验证 「votes」 字段的值等于 100 的查询:
select * from users where exists ( select 1 from orders where orders.user_id = users.id)
为了方便,如果你只是简单比较列值和给定数值是否相等,可以将数值直接作为
where
方法的第二个参数:$users = DB::table('users') ->where('options->language', 'en') ->get();$users = DB::table('users') ->where('preferences->dining->meal', 'salad') ->get();
当然,你也可以使用其他的运算符来编写
where
子句:$users = DB::table('users') ->whereJsonContains('options->languages', 'en') ->get();
你还可以传递条件数组到
where
函数中:$users = DB::table('users') ->whereJsonContains('options->languages', ['en', 'de']) ->get();
Or 语句
你可以一起链式调用 where 约束,也可以在查询中添加
or
字句。orWhere
方法和where
$users = DB::table('users') ->whereJsonLength('options->languages', 0) ->get();$users = DB::table('users') ->whereJsonLength('options->languages', '>', 1) ->get();
{Tip}
unionAll
을 사용할 수도 있습니다. > 메소드,union
메소드 사용법은 동일합니다. 🎜🎜🎜Where 문🎜🎜간단한 Where 문
🎜where
쿼리 인스턴스를 구성할 때where
메서드를 사용할 수 있습니다.where
를 호출하는 가장 기본적인 방법은 세 개의 매개변수를 전달하는 것입니다. 첫 번째 매개변수는 열 이름, 두 번째 매개변수는 데이터베이스 시스템에서 지원하는 연산자, 세 번째 매개변수는 비교할 열입니다. . 값. 🎜🎜예를 들어, 다음은 "votes" 필드의 값이 100인지 확인하는 쿼리입니다. 🎜$users = DB::table('users') ->orderBy('name', 'desc') ->get();
🎜 편의상 단순히 열 값이 주어진 값과 같은지 비교하는 경우 다음을 전달할 수 있습니다. 값을where<로 직접 입력 /code> 메소드의 두 번째 매개변수: 🎜
$user = DB::table('users') ->latest() ->first();
🎜물론 다른 연산자를 사용하여where
절을 작성할 수도 있습니다: 🎜$randomUser = DB::table('users') ->inRandomOrder() ->first();
🎜 조건부 배열을where
에 전달합니다. 함수에서: 🎜$users = DB::table('users') ->groupBy('account_id') ->having('account_id', '>', 100) ->get();
🎜Or 문
🎜 제약 조건을 함께 사용하거나 쿼리또는
단어에 추가하세요.orWhere
메소드는where
메소드와 동일한 매개변수를 받습니다: 🎜$users = DB::table('users') ->groupBy('first_name', 'status') ->having('account_id', '>', 100) ->get();
🎜🎜기타 Where 문
whereBetween
whereBetween
메서드는 필드 값이 지정된 두 값 사이에 있는지 확인합니다.whereBetween
方法验证字段值是否在给定的两个值之间:$users = DB::table('users')->skip(10)->take(5)->get();
whereNotBetween
whereNotBetween
方法验证字段值是否在给定的两个值之外:$users = DB::table('users') ->offset(10) ->limit(5) ->get();
whereIn / whereNotIn
whereIn
方法验证字段的值必须存在指定的数组里,:$role = $request->input('role');$users = DB::table('users') ->when($role, function ($query, $role) { return $query->where('role_id', $role); }) ->get();
whereNotIn
方法验证字段的值必须不存在于指定的数组里:$sortBy = null;$users = DB::table('users') ->when($sortBy, function ($query, $sortBy) { return $query->orderBy($sortBy); }, function ($query) { return $query->orderBy('name'); }) ->get();
whereNull / whereNotNull
whereNull
方法验证指定的字段必须是NULL
:DB::table('users')->insert( ['email' => 'john@example.com', 'votes' => 0]);
whereNotNull
方法验证指定的字段必须不是NULL
:DB::table('users')->insert([ ['email' => 'taylor@example.com', 'votes' => 0], ['email' => 'dayle@example.com', 'votes' => 0] ]);
whereDate / whereMonth / whereDay / whereYear / whereTime
whereDate
方法用于比较字段值与给定的日期:$id = DB::table('users')->insertGetId( ['email' => 'john@example.com', 'votes' => 0] );
whereMonth
方法用于比较字段值与一年中指定的月份:DB::table('users') ->where('id', 1) ->update(['votes' => 1]);
whereDay
方法用于比较字段值与一月中指定的日期:DB::table('users') ->updateOrInsert( ['email' => 'john@example.com', 'name' => 'John'], ['votes' => '2'] );
whereYear
方法用于比较字段值与指定的年份:DB::table('users') ->where('id', 1) ->update(['options->enabled' => true]);
whereTime
方法用于比较字段值与指定的时间(时分秒):DB::table('users')->increment('votes'); DB::table('users')->increment('votes', 5); DB::table('users')->decrement('votes'); DB::table('users')->decrement('votes', 5);
whereColumn
whereColumn
方法用于比较两个字段的值 是否相等:DB::table('users')->increment('votes', 1, ['name' => 'John']);
你也可以传入一个比较运算符:
DB::table('users')->delete(); DB::table('users')->where('votes', '>', 100)->delete();
whereColumn
你也可以传递数组 用and
运算符链接:DB::table('users')->truncate();
参数分组
有时候你需要创建更高级的 where 子句,例如「where exists」或者嵌套的参数分组。 Laravel 的查询构造器也能够处理这些。下面,让我们看一个在括号中进行分组约束的例子:
DB::table('users')->where('votes', '>', 100)->sharedLock()->get();
你可以看到,通过一个
Closure
写入where
方法构建一个查询构造器 来约束一个分组。这个Closure
接收一个查询实例,你可以使用这个实例来设置应该包含的约束。上面的例子将生成以下 SQL:DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();
{提示} 你应该用
orWhere
调用这个分组,以避免应用全局作用出现意外.Where Exists 语句
whereExists
方法允许你使用where exists
SQL 语句。whereExists
方法接收一个Closure
参数,该whereExists
方法接受一个 Closure 参数,该闭包获取一个查询构建器实例从而允许你定义放置在exists
rrreeewhereNotBetween
whereNotBetween
메서드 필드 값이 지정된 두 값을 벗어나는지 확인합니다. rrreeewhereIn / whereNotIn🎜🎜whereIn
이 메서드는 필드 값이 지정된 배열에 존재해야 하는지 확인합니다. 🎜rrreee🎜 < code>whereNotIn 메서드는 필드 값이 지정된 배열에 없어야 하는지 확인합니다. 🎜rrreee🎜🎜whereNull / whereNotNull🎜🎜🎜whereNull
메서드는 지정된 필드가 다음과 같아야 하는지 확인합니다.NULL
:🎜rrreee🎜whereNotNull
이 메서드는 지정된 필드가NULL
이 아니어야 하는지 확인합니다.🎜rrreee🎜🎜whereDate / whereMonth / whereDay / whereYear / whereTime🎜🎜🎜whereDate
메소드는 필드 값을 주어진 날짜와 비교하는 데 사용됩니다. 🎜rrreee🎜whereMonth
메소드는 필드 값을 지정된 월과 비교하는 데 사용됩니다. 연도: 🎜rrreee🎜whereDay
이 메서드는 필드 값을 1월의 지정된 날짜와 비교하는 데 사용됩니다. 🎜rrreee🎜whereYear
메서드는 필드 값을 비교하는 데 사용됩니다. 지정된 연도 포함: 🎜rrreee🎜whereTime
이 메서드는 필드 값을 지정된 시간(시, 분, 초)과 비교하는 데 사용됩니다: 🎜rrreee🎜🎜whereColumn🎜🎜🎜whereColumn< /code> 이 메소드는 두 필드의 값이 같은지 비교하는 데 사용됩니다: 🎜rrreee🎜비교 연산자를 전달할 수도 있습니다: 🎜rrreee🎜
whereColumn
배열을 전달할 수도 있습니다and
연산자 체인 사용: 🎜rrreee🎜🎜 🎜🎜매개변수 그룹화< /h3>🎜때때로 "where presents" 또는 중첩된 매개변수 그룹화와 같은 고급 where 절을 생성해야 할 때가 있습니다. Laravel의 쿼리 빌더도 이를 처리할 수 있습니다. 다음으로 괄호 안에 제약 조건을 그룹화하는 예를 살펴보겠습니다. 🎜rrreee🎜
where
메서드에클로저
를 작성하여 쿼리 빌더를 작성하면 이를 확인할 수 있습니다. . 이클로저
는 포함되어야 하는 제약 조건을 설정하는 데 사용할 수 있는 쿼리 인스턴스를 수신합니다. 위의 예는 다음 SQL을 생성합니다:🎜rrreee🎜{Tip} 실수로 전역 효과가 적용되는 것을 방지하려면
🎜🎜🎜orWhere
를 사용하여 이 그룹을 호출해야 합니다.🎜🎜Where Exists-clauses
🎜whereExists
메소드를 사용하면 < code>where presents SQL 문을 사용합니다.whereExists
메소드는Closure
매개변수를 허용합니다.whereExists
메소드는 Closure 매개변수를 허용합니다. 클로저는 배치 쿼리를 정의할 수 있는 쿼리 빌더 인스턴스를 얻습니다.exists
문장에서: 🎜rrreee🎜위 쿼리는 다음 SQL 문을 생성합니다: 🎜rrreee🎜🎜🎜🎜🎜🎜JSON Where 문
Laravel은 JSON 유형 필드 쿼리도 지원합니다(JSON 유형을 지원하는 데이터베이스에만 해당). 현재 이 기능은 MySQL 5.7, PostgreSQL, SQL Server 2016 및 SQLite 3.9.0(JSON1 확장 포함)만 지원합니다.
rrreee->
연산자를 사용하여 JSON 데이터를 쿼리합니다.->
操作符查询 JSON 数据:你也可以使用
rrreeewhereJsonContains
来查询 JSON 数组:MySQL 和 PostgreSQL 的
rrreeewhereJsonContains
可以支持多个值:你可以使用
rrreeewhereJsonLength
来查询 JSON 数组的长度:Ordering, Grouping, Limit, & Offset
orderBy
rrreeeorderBy
方法允许你通过给定字段对结果集进行排序。orderBy
的第一个参数应该是你希望排序的字段,第二个参数控制排序的方向,可以是asc
或desc
:latest / oldest
rrreeelatest
和oldest
方法可以使你轻松地通过日期排序。它默认使用created_at
列作为排序依据。当然,你也可以传递自定义的列名:inRandomOrder
rrreeeinRandomOrder
方法被用来将结果随机排序。例如,你可以使用此方法随机找到一个用户。groupBy / having
rrreeegroupBy
和having
方法可以将结果分组。having
方法的使用与where
方法十分相似:你可以向
rrreeegroupBy
方法传递多个参数:对于更高级的
having
语法,参见havingRaw
方法。skip / take
要限制结果的返回数量,或跳过指定数量的结果,你可以使用
rrreeeskip
和take
方法:或者你也可以使用
limit
和offset
rrreeewhereJsonContains
를 사용하여 JSON 배열을 쿼리할 수도 있습니다. MySQL의 경우rrreee
whereJsonContains
는 여러 값을 지원할 수 있습니다. rrreeewhereJsonLength
를 사용하여 JSON 배열의 길이를 쿼리할 수 있습니다.rrreee🎜🎜🎜순서, 그룹화, 제한 및 오프셋
🎜orderBy
🎜orderBy
메소드를 사용하면 주어진 필드를 기준으로 결과 세트를 정렬할 수 있습니다.orderBy
의 첫 번째 매개변수는 정렬하려는 필드여야 하며, 두 번째 매개변수는asc
또는desc
: 🎜rrreee🎜최신/가장 오래된
🎜최신
및가장 오래된
방법을 사용하면 날짜별로 쉽게 정렬할 수 있습니다. 기본적으로created_at
열을 정렬로 사용합니다. 물론 사용자 정의 열 이름을 전달할 수도 있습니다. 🎜inRandomOrder
🎜inRandomOrder
메소드를 사용하여 결과를 무작위로 정렬합니다. 예를 들어 이 방법을 사용하여 임의의 사용자를 찾을 수 있습니다. 🎜rrreee🎜groupBy / have
🎜groupBy
및having
메소드는 결과 그룹.having
메소드의 사용법은where
메소드와 매우 유사합니다: 🎜rrreee🎜groupBy
메소드에 여러 매개변수를 전달할 수 있습니다: 🎜rrreee 🎜having
구문에 대한 고급 정보는havingRaw
🎜 메서드를 참조하세요. 🎜🎜건너뛰기/가져오기
🎜반환되는 결과 수를 제한하거나 지정된 수의 결과를 건너뛰려면를 사용하세요. Skip
및take
메서드: 🎜rrreee🎜 또는limit
및offset
메서드를 사용할 수도 있습니다: 🎜rrreee🎜🎜🎜🎜 🎜🎜조건문
때로는 특정 조건이 참인 경우에만 쿼리를 실행하는 절을 원할 수도 있습니다. 예를 들어 요청에 지정된 값이 있는 경우에만
rrreeewhere
문을 적용할 수 있습니다.when
메소드를 사용하여 이를 수행할 수 있습니다:where
语句。 你可以通过使用when
方法:when
方法只有在第一个参数为true
的时候才执行给的的闭包。如果第一个参数为false
,那么这个闭包将不会被执行你可以传递另一个闭包作为
rrreeewhen
方法的第三个参数。 该闭包会在第一个参数为false
的情况下执行。为了说明如何使用这个特性,我们来配置一个查询的默认排序:插入
查询构造器还提供了
rrreeeinsert
方法用于插入记录到数据库中。insert
方法接收数组形式的字段名和字段值进行插入操作:你甚至可以将数组传递给
rrreeeinsert
方法,将多个记录插入到表中自增 ID
如果数据表有自增 ID ,使用
rrreeeinsertGetId
方法来插入记录并返回 ID 值{注意} 当使用 PostgreSQL 时,
insertGetId
方法将默认把id
作为自动递增字段的名称。如果你要从其他「序列」来获取 ID ,则可以将字段名称作为第二个参数传递给insertGetId
方法。更新
当然, 除了插入记录到数据库中,查询构造器也可以通过
rrreeeupdate
方法更新已有的记录。update
方法和insert
方法一样,接受包含要更新的字段及值的数组。你可以通过where
子句对update
查询进行约束:更新或者新增
有时您可能希望更新数据库中的现有记录,或者如果不存在匹配记录则创建它。 在这种情况下,可以使用
updateOrInsert
方法。updateOrInsert
方法接受两个参数:一个用于查找记录的条件数组,以及一个包含要更该记录的键值对数组。updateOrInsert
rrreeewhen
메소드는 첫 번째 매개변수가true
일 때만 주어진 클로저를 실행합니다. 첫 번째 매개변수가false
이면 이 클로저는 실행되지 않습니다🎜🎜insert🎜🎜 쿼리 생성자는 데이터베이스에 레코드를 삽입하기 위한insert
메소드도 제공합니다.insert
메소드는 삽입 작업을 위해 배열 형식으로 필드 이름과 필드 값을 받습니다. 🎜rrreee🎜insert
메소드에 배열을 전달하여 여러 항목을 삽입할 수도 있습니다. rrreee🎜자동 증가 ID
🎜데이터 테이블에 자동 증가 ID가 있는 경우를 사용하세요. insertGetId
메소드를 사용하여 레코드를 삽입하고 ID 값을 반환합니다🎜rrreee🎜{참고} PostgreSQL을 사용할 때
🎜🎜🎜insertGetId
메소드는 기본적으로id
를 기본값으로 사용합니다. 자동 증가 필드의 이름입니다. 다른 "시퀀스"에서 ID를 가져오려면 필드 이름을insertGetId
메서드의 두 번째 매개변수로 전달할 수 있습니다. 🎜🎜🎜Updates🎜🎜물론 데이터베이스에 레코드를 삽입하는 것 외에도 쿼리는 빌더는update
메소드를 통해 기존 레코드를 업데이트할 수도 있습니다.update
메서드는insert
메서드와 마찬가지로 업데이트할 필드와 값이 포함된 배열을 받아들입니다.where
절을 통해update
쿼리를 제한할 수 있습니다: 🎜rrreee🎜update 또는 new ADD
🎜때로는 데이터베이스의 기존 레코드를 업데이트하거나, 일치하는 레코드가 없으면 생성해야 할 수도 있습니다. 이 경우updateOrInsert
메소드를 사용할 수 있습니다.updateOrInsert
메소드는 두 개의 매개변수, 즉 레코드를 찾기 위한 기준 배열과 업데이트할 레코드가 포함된 키-값 쌍의 배열을 허용합니다. 🎜🎜updateOrInsert
메소드는 먼저 첫 번째 매개변수의 키와 값 쌍을 사용하여 일치하는 데이터베이스 레코드를 찾으려고 시도합니다. 레코드가 존재하는 경우 두 번째 매개변수의 값을 사용하여 레코드를 업데이트합니다. 레코드를 찾을 수 없으면 새 레코드가 삽입되고 업데이트된 데이터는 🎜rrreee🎜🎜🎜🎜🎜🎜 두 배열의 모음입니다.JSON 필드 업데이트
JSON 필드를 업데이트할 때
rrreee->
구문을 사용하여 JSON 개체의 해당 값에 액세스할 수 있습니다. 이 작업은 MySQL 5.7 이상만 지원합니다.->
语法访问 JSON 对象中相应的值,此操作只能支持 MySQL 5.7+:自增与自减
查询构造器还为给定字段的递增或递减提供了方便的方法。此方法提供了一个比手动编写
update
语句更具表达力且更精练的接口。这两种方法都至少接收一个参数:需要修改的列。第二个参数是可选的,用于控制列递增或递减的量:
rrreee你也可以在操作过程中指定要更新的字段:
rrreee删除
查询构造器也可以使用
rrreeedelete
方法从表中删除记录。 在使用delete
前,可以添加where
子句来约束delete
语法:如果你需要清空表,你可以使用
rrreeetruncate
方法,它将删除所有行,并重置自增 ID 为零:悲观锁
查询构造器也包含一些可以帮助你在
rrreeeselect
语法上实现「悲观锁定」的函数。若想在查询中实现一个「共享锁」, 你可以使用sharedLock
方法。 共享锁可防止选中的数据列被篡改,直到事务被提交为止 :或者,你可以使用
lockForUpdate
rrreeeupdate
문을 수동으로 작성하는 것보다 더 표현적이고 간결한 인터페이스를 제공합니다. 🎜🎜두 메소드 모두 최소한 하나의 매개변수(수정해야 하는 열)를 받습니다. 두 번째 매개변수는 선택사항이며 열이 증가하거나 감소하는 양을 제어합니다. 🎜rrreee🎜 작업 중에 업데이트할 필드를 지정할 수도 있습니다. 🎜rrreee🎜 🎜쿼리 빌더는 지정된 필드를 증가 또는 감소시키는 편리한 방법도 제공합니다. 이 방법은 🎜🎜🎜삭제
🎜쿼리 빌더는delete
메서드를 사용하여 테이블에서 레코드를 삭제할 수도 있습니다.삭제
를 사용하기 전에where
절을 추가하여삭제
구문을 제한할 수 있습니다. 구문: 🎜rrreee🎜테이블을 지워야 하는 경우 다음을 사용할 수 있습니다. 모든 행을 삭제하고 자동 증가 ID를 0으로 재설정하는truncate
메서드: 🎜rrreee🎜🎜🎜🎜비관적 잠금
🎜 쿼리 빌더에는select
구문에서 "비관적 잠금"을 구현하는 데 도움이 될 수 있는 일부 기능도 포함되어 있습니다. 쿼리에 "공유 잠금"을 구현하려면sharedLock
메서드를 사용할 수 있습니다. 공유 잠금은 트랜잭션이 커밋될 때까지 선택한 데이터 열이 변조되는 것을 방지합니다. 🎜rrreee🎜 또는lockForUpdate
메서드를 사용할 수도 있습니다. 다른 공유 잠금에 의해 행이 수정되거나 선택되는 것을 방지하려면 "업데이트" 잠금을 사용하세요. 🎜rrreee🎜이 기사는 🎜LearnKu.com🎜 웹사이트에 처음 게시되었습니다. 🎜🎜