$results = \DB::select('select * from articles where id = ?', [2]);
Query Builderの説明を読んだほうが早い。通常はEloquent使うと思うので使わないと思う。特殊なSQLを発行したい時に使おう。
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $table = ‘users'
}
こんなModelをどこかに書いて(どこでもいい)
$users = User::where(‘group_id’, ‘=‘, 1)->get();
こんな感じで呼び出せる。詳細はEloquent ORMの説明を読もう。 何故か行ロックは実装されていないので、
public static function lock($id, $columns = array('*'))
{
$instance = new static;
if (is_array($id) && empty($id)) return $instance->newCollection();
return $instance->newQuery()->lockForUpdate()->find($id, $columns);
}
こんなのを用意しておくと便利。
DB::beginTransaction();
// 処理
DB::commit();
DB::rollback();
||<
で行けるが、
>|php|
DB::transaction(function() {
// 処理
});
でも可能。この場合、例外で終了するとrollbackするようになる。
DB::connection(‘other_connection_name’)->select(...);
のような感じで可能。DB
は(デフォルトでは)\Illuminate\Database\DatabaseManager
のFacadeなので、そのままstaticアクセスするとデフォルトの\Illuminate\Database\Connection
になるし(__call()
でたらい回ししてる)、DB:connection()
でインスタンスを返してそれを操作することもできる。
** デフォルト接続を途中で変える
DB::setDefaultConnection(‘new_connection_name’);
ORMとうまく組み合わせると、複数の同一構造のDBを操作したりできる、かもしれない。
class Hoge extends Model
{
protected $connection = ‘new_connection_name’;
}
ちなみにmigrationでも同じように$connectionで接続先を指定できる。複数DBを扱う時でも安心。
hasManyとかはデータ取得には使えるけどJOINクエリの構築には(あまり)使えない。
素直にJOINを書こう。
ちなみにJOINする時はselect(‘table_name.*’)を書かないと、デフォルトでSELECT * FROM〜
するので、同名カラムが他テーブルに含まれてると壊れる。
例えば、SELECT users.* FROM users INNER JOIN comments AS c ON users.id = c.user_id WHERE c.created > 10
のようなクエリは、
Users::select('users.*')->join('comments as c', 'users.id', '=', 'c.user_id')->where('c.created', '>', 10)->get();
のように書く。 ON句をもっと詳しく書きたい、例えば複数条件や定数、NOT NULL等をONに入れたい場合は、JOINの第二引数に無名関数を入れる。
Users::select('users.*')->join('comments as c', function($join) {
$join->on('c.user_id', '=', 'users.id');
$join->where('c.blog_id', '=', 3);
})->where('c.created', '>', 10)->get();