「Php/laravel/laravel5/orm」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→スコープ) |
(→in) |
||
(同じ利用者による、間の26版が非表示) | |||
行38: | 行38: | ||
echo $article->title."\n"; | echo $article->title."\n"; | ||
} | } | ||
+ | |||
+ | ==1カラム取得== | ||
+ | column1を取得したい場合 | ||
+ | \App\Article::first()->column1; | ||
==取得== | ==取得== | ||
行51: | 行55: | ||
==limitを指定して取得== | ==limitを指定して取得== | ||
$articles = \App\Article::where('active', 1)->take(10)->get(); | $articles = \App\Article::where('active', 1)->take(10)->get(); | ||
+ | |||
+ | ==順位== | ||
+ | $articles = \App\Article::where('active', 1)->orderBy('updated_at')->get(); | ||
+ | |||
+ | ==不等号== | ||
+ | User::where('votes', '>', 100) | ||
+ | |||
+ | ==like== | ||
+ | User::where('name', 'like', "%".$q."%") | ||
+ | |||
+ | ==条件をphpで追加する== | ||
+ | $query = User::query(); | ||
+ | $query->where('name', 'taro') | ||
+ | $query->where('age', 10) | ||
+ | $users = $query->get(); | ||
+ | |||
+ | ==onWhereで(a or b) and cを作る== | ||
+ | $query = User::query(); | ||
+ | $query->where('age', 10) | ||
+ | $query->where(function($query) use($word) { | ||
+ | $query->where('introduction', 'like', '%'.$word.'%') | ||
+ | orWhere('hobbies', 'like', '%'.$word.'%') | ||
+ | }); | ||
+ | |||
+ | ==sql表示== | ||
+ | $query = User::query(); | ||
+ | echo $query->toSql(); | ||
==挿入== | ==挿入== | ||
+ | $test = \App\Article::create( | ||
+ | ['user_id' => 6] | ||
+ | ); | ||
+ | |||
+ | vi app/Article.php | ||
+ | class Article extends Model | ||
+ | { | ||
+ | // guardedがないと(Illuminate\Database\Eloquent\MassAssignmentException)エラーになる | ||
+ | protected $guarded = array('id'); | ||
+ | } | ||
+ | |||
+ | ==挿入、その2== | ||
+ | ただこれだとテストしずらくなる | ||
$article = new \App\Article(); | $article = new \App\Article(); | ||
$article->title = 'net'; | $article->title = 'net'; | ||
$article->save(); | $article->save(); | ||
− | + | ||
+ | ==挿入して更新== | ||
+ | こうするとprimary_keyなどが自動で入り後はデフォルトで挿入された後、updateが走る | ||
+ | $article = \App\Article::create(); | ||
+ | $article->title = 'net'; | ||
+ | $article->save(); | ||
+ | |||
==更新== | ==更新== | ||
$article = \App\Article::find(2); | $article = \App\Article::find(2); | ||
行65: | 行115: | ||
$article = \App\Article::find(2); | $article = \App\Article::find(2); | ||
$article->delete(); | $article->delete(); | ||
+ | |||
+ | ==件数== | ||
+ | \App\Article::where('id', $id)->count(); | ||
+ | |||
+ | ==in== | ||
+ | Article::whereIn('id', [10,11,12,13]) | ||
+ | |||
+ | ==A and (B or C)== | ||
+ | User::where('sex' , 'male') | ||
+ | ->where(function($query){ | ||
+ | $query->where('age', '<', 10) | ||
+ | ->orWhere('score', '>', 70); | ||
+ | }) | ||
+ | ->get(); | ||
+ | 参考:http://mask.hatenadiary.com/entry/2014/11/22/151730 | ||
+ | |||
+ | User:::where('match_id', $match_id) | ||
+ | ->whereRaw('(user_id = ? OR to_user_id = ?)', [$user_id, $to_user_id]) | ||
+ | ->get(); | ||
+ | |||
+ | ==WhereRawを使ってエスケープ== | ||
+ | // 30日経過したものだけを1行取り出す | ||
+ | $articles = \App\Article::whereRaw('updated_at < now() - INTERVAL 30 DAY')->orderBy('updated_at')->first() | ||
==スコープ== | ==スコープ== | ||
行70: | 行143: | ||
public static function insertName($name, $url) | public static function insertName($name, $url) | ||
{ | { | ||
− | $ | + | $class = get_class(); |
+ | $row = new $class; | ||
$row->url = $url; | $row->url = $url; | ||
$row->name = $name; | $row->name = $name; | ||
行83: | 行157: | ||
} | } | ||
\App\Test::findRowByName('name1'); | \App\Test::findRowByName('name1'); | ||
+ | |||
+ | ==公式== | ||
+ | https://laravel.com/docs/4.2/eloquent |
2018年2月8日 (木) 13:03時点における最新版
目次
laravelのorm
Eloquent ORMをつかう
モデル自動生成
php artisan make:model Article
vi app/Article.php
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Article extends Model { protected $primaryKey = 'id'; protected $table = 'articles'; public $timestamps = true; }
table作成
CREATE TABLE `articles` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, `title` varchar(63) DEFAULT NULL, `body` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
timestamps設定について
1を設定するとcreated_atとupdated_atに挿入・更新時、自動で日付が入る
| id | created_at | updated_at | title | body | +----+---------------------+---------------------+-------+------+ | 1 | 2016-02-18 22:40:14 | 2016-02-18 22:40:14 | net | |
全取得
vi app/Http/Controllers/ArticleController.php
$articles = \App\Article::all(); foreach ($articles as $article) { echo $article->id."\n"; echo $article->title."\n"; }
1カラム取得
column1を取得したい場合
\App\Article::first()->column1;
取得
$article = \App\Article::find(2); // primary keyを引数に入れる // App\Article Objectが返ってくる echo $article->title;
条件をつけて1行取得
$article = \App\Article::where('active', 1)->first();
条件をつけて複数行取得
$articles = \App\Article::where('active', 1)->get();
limitを指定して取得
$articles = \App\Article::where('active', 1)->take(10)->get();
順位
$articles = \App\Article::where('active', 1)->orderBy('updated_at')->get();
不等号
User::where('votes', '>', 100)
like
User::where('name', 'like', "%".$q."%")
条件をphpで追加する
$query = User::query(); $query->where('name', 'taro') $query->where('age', 10) $users = $query->get();
onWhereで(a or b) and cを作る
$query = User::query(); $query->where('age', 10) $query->where(function($query) use($word) { $query->where('introduction', 'like', '%'.$word.'%') orWhere('hobbies', 'like', '%'.$word.'%') });
sql表示
$query = User::query(); echo $query->toSql();
挿入
$test = \App\Article::create( ['user_id' => 6] );
vi app/Article.php
class Article extends Model { // guardedがないと(Illuminate\Database\Eloquent\MassAssignmentException)エラーになる protected $guarded = array('id'); }
挿入、その2
ただこれだとテストしずらくなる
$article = new \App\Article(); $article->title = 'net'; $article->save();
挿入して更新
こうするとprimary_keyなどが自動で入り後はデフォルトで挿入された後、updateが走る
$article = \App\Article::create(); $article->title = 'net'; $article->save();
更新
$article = \App\Article::find(2); $article->title = 'it'; $article->save();
削除
$article = \App\Article::find(2); $article->delete();
件数
\App\Article::where('id', $id)->count();
in
Article::whereIn('id', [10,11,12,13])
A and (B or C)
User::where('sex' , 'male') ->where(function($query){ $query->where('age', '<', 10) ->orWhere('score', '>', 70); }) ->get();
参考:http://mask.hatenadiary.com/entry/2014/11/22/151730
User:::where('match_id', $match_id) ->whereRaw('(user_id = ? OR to_user_id = ?)', [$user_id, $to_user_id]) ->get();
WhereRawを使ってエスケープ
// 30日経過したものだけを1行取り出す $articles = \App\Article::whereRaw('updated_at < now() - INTERVAL 30 DAY')->orderBy('updated_at')->first()
スコープ
// 挿入 public static function insertName($name, $url) { $class = get_class(); $row = new $class; $row->url = $url; $row->name = $name; $row->save(); } \App\Test::insertName('name1', 'url1');
// 取得 public static function findRowByName($name) { return self::where('name', $name)->first(); } \App\Test::findRowByName('name1');