プログラム言語 データベース操作 データ取得

データ取得

データ型
protected $modelClass = ‘Tests’;
$tests = $this–>Tests–>find()–>all();

モデルクラスのインスタンスを要素とするコレクションを取得

use App\Models\Test;
$tests = Test::all();

モデルクラスのインスタンスを要素とするコレクションを取得

$tests = DB::table('テーブル物理名')–>get();

配列を取得

FROM
use App\Models\Test;
$tests = Test::all();

別名
$tests = Test::from('tests as t')–>all();

$tests = DB::table('テーブル物理名 as t')–>get();

別名
$tests = DB::table('テーブル物理名')–>get();

全件
protected $modelClass = ‘Tests’;
$tests = $this–>Tests–>find()–>all();

$testsTable = $this–>getTableLocator()–>get('Tests');
$tests = $testsTable–>find()–>all();

use App\Models\Test;
$tests = Test::all();
$tests = DB::table('テーブル物理名')–>get();
先頭
$tests = $this–>Tests–>find()
 –>first();
$tests = Test::first();
Eloquentと同じ
末尾
$tests = $this–>Tests–>find()
 –>last();
$tests = Test::last();
Eloquentと同じ
COUNT
$tests = $this–>Tests–>find()
 –>count();
$tests = Test::count();

 結合先テーブルのレコード数
 –>withCount('モデルクラス名');

$tests = Test::table(〜)–>count();
SUM
$query = $this–>Tests
 –>find()
 –>where([
  〜
 ]);

$test = $query–>select([
 '定義名' => $query–>func()–>sum('列名'),
])
–>first();

$tests = Test::count();

 結合先テーブルのレコード数
 –>withCount('モデルクラス名');

$tests = Test::table(〜)–>count();
値のみ
$tests = $this–>Tests–>find()
 –>select(['列名'])
 –>enableHydration(false)
 –>all()
 –>extract('列名')
 –>toList();

結果 $tests = [1, 2, 3, 4, 5];

$tests = Test::pluck('列名');

結果 $tests = [1, 2, 3, 4, 5];

Eloquentと同じ
SELECT
$tests = Test::select('列名')
 –>addSelect(〜);
Eloquentと同じ

WHERE

=
$tests = $this–>Tests–>find()
 –>where([
  '列名' => 100,
  '列名' => XXX, And条件
 ]);
 –>andWhere([
  '列名' => 100,
 ]);
 –>orWhere([
  '列名' => 100,
 ]);
 –>all();
$tests = Test::where('列名', 100)
 –>where('列名', XXX) And条件
 –>orWhere('列名', XXX) Or条件
 –>get();

$tests = Test::whereRaw('列名 = 100')–>get();

$tests = DB::table('テーブル物理名')
 –>where('列名', 100)
 –>where('列名', XXX) And条件
 –>orWhere('列名', XXX) Or条件
 –>get();

$tests = DB::table('テーブル物理名')
 –>whereRaw('列名 = 100')
 –>get();

IN
$tests = $this–>Tests–>find()
 –>where([
  '列名 IN' => [100, 200, 300],
 ]);
 –>all();
$tests = Test::whereIn('列名', [100, 200, 300])
 –>get();
$tests = DB::table('テーブル物理名')
 –>whereIn('列名', [100, 200, 300])
 –>get();
BETWEEN
$tests = $this–>Tests–>find()
 –>where(function ($exp) {
  $timestamp = FrozenTime::now()->subDay(1);

  return $exp->between(
   'Tests.created',
   $timestamp->startOfDay()->toDateTimeString(),
   $timestamp->endOfDay()->toDateTimeString()
  );
 })
 –>all();

$tests = Test::whereBetween('列名', [100, 200])
 –>get();
$tests = DB::table('テーブル物理名')
 –>whereBetween('列名', [100, 200])
 –>get();
NULL判定
$tests = Test::whereNull(列名)
->orWhereNull(列名); OR条件
->whereNotNull(列名); AND条件
->orWhereNotNull(列名); OR条件
->get();
Eloquentと同じ
A AND (B OR C)
$tests = Test::where(function($query){
 return $query
  ->where(〜)
  ->orWhere(〜);
})
->get();
Eloquentと同じ

JOIN

INNER JOIN
リレーション定義済の場合
$tests = $this–>Tests
 –>contain([
  '結合先テーブルクラス名1',
  '結合先テーブルクラス名2',
  結合先と更に結合
  '結合先テーブルクラス名3' =;> [
   '結合先テーブルクラス名4',
  ],
  結合条件指定
  '結合先テーブルクラス名5' =;> function (Query $query) use ($test) {
   return $query->where(['結合先テーブルクラス名5.列名' =;> $test->id]);
  },
 ])
 –>find()–>all();

結果
foreach($tests as $t){
 $t–>結合先テーブル名–>〜;
}

結合先テーブルのデータは取得しない場合1
$tests = $this–>Tests
 –>innerJoinWith('結合先テーブルクラス名6')
 –>innerJoinWith('結合先テーブルクラス名7', function ($q) use ($test) {
  return $q
   –>where(['結合先テーブルクラス名7.列名' =;> $test->id]);
 })
 –>find()–>all();

結合先テーブルのデータは取得しない場合2
$tests = $this–>Tests
 –>join()
  'table' => 'テーブル物理名',
  'alias' => 'テーブル別名',
  'type' => 'INNER',
  'conditions' => 'テーブル別名.列名 = 結合元テーブル名.列名',
 –>find()–>all();

use App\Models\Test;
$tests = Test::with('結合先テーブルクラス名')–>all();

$tests = Test::with(['結合先テーブルクラス名' =;> function($query){
 $query->where('結合先テーブル列名', ‘LIKE’, ‘%〜%’);
}])->get(),

↓は可能だがEager Loadingを使用しない為にメリット無し
$tests = Test::join(
 '結合先テーブル物理名',
 '結合先テーブル物理名.列名', '=', 'テーブル物理名.列名'
)
–>get();

結果
foreach($tests as $t){
 $t–>結合先テーブルクラス名–>〜;
}

$tests = DB::table('テーブル物理名')
 –>join(
  '結合先テーブル物理名',
  '結合先テーブル物理名.列名', '=', 'テーブル物理名.列名'
 )
 –>get();

結果
foreach($tests as $t){
 $t–>結合先テーブルクラス名–>〜;
}

LEFT JOIN
リレーション定義済の場合
$tests = $this–>Tests
 –>contain([
  〜
 ])
 –>find()–>all();

結合先テーブルのデータは取得しない場合1
$tests = $this–>Tests
 –>leftJoinWith('結合先テーブルクラス名6')
 –>leftJoinWith('結合先テーブルクラス名7', function ($q) use ($test) {
  return $q
   –>where(['結合先テーブルクラス名7.列名' =;> $test->id]);
 })
 –>find()–>all();

結合先テーブルのデータは取得しない場合2
$tests = $this–>Tests
 –>join()
  'table' => 'テーブル物理名',
  'alias' => 'テーブル別名',
  'type' => 'LEFT',
  'conditions' => 'テーブル別名.列名 = 結合元テーブル名.列名',
 –>find()–>all();

結合先テーブルのデータも取得する場合
$tests = $this–>Tests
 –>matching('結合先テーブルクラス名8')
 –>matching('結合先テーブルクラス名8', function ($q) use ($test) {
  return $q
   –>where(['結合先テーブルクラス名8.列名' =;> $test->id]);
 })
 –>find()–>all();

結果
foreach($tests as $t){
 $t–>_matchingData['結合先テーブルクラス名']–>〜;
}

use App\Models\Test;
$tests = Test::leftJoin(
  '結合先テーブル物理名',
  '結合先テーブル物理名.列名', '=', 'テーブル物理名.列名'
 )
 –>get();

結果
foreach($tests as $t){
 $t–>結合先テーブルクラス名–>〜;
}

$tests = DB::table('テーブル物理名')
 –>leftJoin(
  '結合先テーブル物理名',
  '結合先テーブル物理名.列名', '=', 'テーブル物理名.列名'
 )
 –>get();

結果
foreach($tests as $t){
 $t–>結合先テーブルクラス名–>〜;
}

ORDER BY

$tests = Test::orderBy(列名, 'ASC')
 ->orderBy(列名, 'DESC')
 ->get();
Eloquentと同じ

サブクエリ

SELECT句
use App\Models\Test;
$tasks = Test::leftJoin(〜)
 ->leftJoin(〜)
 ->select()
 ->selectSub(
   use App\Models\TestMany;
  TestMany::selectRaw('count(*)')
   ->whereRaw('副問い合わせ先テーブル名.列名 = 〜.id')
  , 'SubCount')
 ->get();

※with(EargerLoading)を用いてのサブクエリは調査中

JOIN
use App\Models\TestMany;
$subQuery = TestMany::〜;

use App\Models\Test;
$tasks = Test::leftJoin(
  DB::raw("(${subQuery}) AS SubTable", 'SubTable.列名', '=', 'tests.id')
 )
 ->get();

Follow me!