原文: https://jellybool.com/post/programming-with-laravel-5-database-and-eloquent-model
前に Laravel を書きましたこのセクションでは、データベースと Laravel の強力な Eloquent を扱うためのデータベース構成について説明します。
Laravel のデータベース構成
Laravel の構成ファイルはすべて、以下のプロジェクト ディレクトリの config/ フォルダーにありますこれは、blog/config フォルダーの下にあります。このフォルダーを開いて確認してください。mail.php (メール送信サービスの構成用) や、database.php (データベースの構成用) などです。
ファイルを開くと、単純な php 配列が返されていることがわかります。現時点では接続のみを考慮しています。配列。上記のコードはすべてのデータベース構成を示しているわけではありません。ブロガーは mysql を使用しているため、他のデータベースについても参照できます。同じようにmysqlを使用します。
'connections' => [ 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, ] //... ]
ここで説明する設定は、基本的に次の 4 つの変数の設定です。
ここでの env() メソッドは、.env (blog/.env にあります) を読み取ることです。 設定項目このファイル内
'host' => env('DB_HOST', 'localhost'),//如果.env文件没有DB_HOST配置,则取localhost,后面的一样'database' => env('DB_DATABASE', 'forge'),'username' => env('DB_USERNAME', 'forge'),'password' => env('DB_PASSWORD', ''),
このファイルを開くと、デバッグ モードや開発環境などの一般的に使用される設定が表示されます。また、次の設定も表示されます。 操作する必要があるオプション:
ここでは Homestead 開発環境を使用しているので、上記の設定になっています (Homestead のデフォルトのユーザー名とパスワードは homestead と Secret です)。 直接使用する場合は、phpArtisan Serve を起動します。開発用サービスの場合は、それに応じて構成を変更します。
DB_HOST=localhostDB_DATABASE=homesteadDB_USERNAME=homesteadDB_PASSWORD=secret
Laravel はなぜこのような構成を採用しているのでしょうか?大きな理由は、ファイルのセキュリティと利便性を考慮するためであると考えられます。これにより、コードをコーディングまたは Github にプッシュする必要がある場合、コア情報が漏洩することを心配せずに .env ファイルを直接無視できます。アプリケーションをデプロイする場合、サーバー上に .env ファイルを直接作成し、対応する構成項目を書き込むことができます。
これで完了です。情報が正しく設定されていれば、最初にホームステッド データベースを作成する必要があります。
移行を使用する
ここで移行を使用することに納得していない場合は、基本的に赤いボックスが最も一般的に使用されます。
まず、移行ファイルを作成します。これは、スキーマを定義します。テーブル、コマンドライン実行:
php artisan make:migration create_articles_table --create='articles'
実行が成功すると、database/migrations/ の下にある移行ファイルを取得します。このフォルダーを開くと、次のことがわかります。 Laravel には元々、users テーブルとpassword-reset テーブルという 2 つの移行ファイルがありますが、このプロジェクトではまだこれら 2 つのファイルを使用していません。したがって、これを直接削除して、生成したばかりの移行ファイルを開くことができます。 create_articles_table file
ここには、up() と down() という 2 つのメソッドがあります。 up()メソッドは、phpArtisan Migrateを実行するときに呼び出され、articleデータテーブルを作成します。一方、down()メソッドは、phpArtisan Migrate:rollbackを使用するときに実行されます。ここでは、articleデータテーブルが直接削除されます。
public function up() { Schema::create('articles', function (Blueprint $table) { $table->increments('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('articles'); }
ただし、ここで php 職人移行を急いで実行しないでください。記事にいくつかのフィールドを追加する必要もあります。
ここでのイントロ フィールドは記事の導入部分です。そして、published_at フィールドは記事の公開日です。これは私たちのブログにとって非常に役立ちます。私が書いたもののまだ公開日に達していないものもあるためです。ユーザーにそれらを見られたくないので、published_at を使用して記事を制御できます。この後、php 職人移行を実行しましょう:
public function up() { Schema::create('articles', function (Blueprint $table) { $table->increments('id');// 主键 自增 $table->string('title'); $table->text('intro'); $table->text('content'); $table->timestamp('published_at'); $table->timestamps(); // 自动创建的两个字段:created_at 和 updated_at }); }
これで、articles テーブルが正常に作成されました。
現時点では、移行のメリットをまだ理解していないかもしれません。次の 2 つのシナリオを想像してください。
たとえば、2 番目のシナリオを解決する方法を説明します。シナリオは次のとおりです。:
1. 在进行团队开发的时候,团队成员将我们的代码pull下来之后,怎么可以拿到一样的数据库表设计呢?难道要我们将表 export 出来,给每一个成员import一次?这显然不够明智,如果使用的migration,就一行命令,直接`php artisan migrate`,就可以拿到一样的数据库表了。2. 如果这个时候我们发现articles这个表的有一个字段写错了,比如我们的intro字段写错,它应该命名为introduction的,这个时候,我们怎么办?直接手动改数据库的表?那么回到第一个场景,你的团队成员也需要手动改?这显然也不是我们喜欢的方式,这个时候,migration的优势就来了
コマンドラインを実行するだけです:
php artisan migrate:rollback
次に、up() メソッドのイントロフィールドを変更します:
$table->text('introduction');
然后再执行php artisan migrate:
大工告成,更多特性请看文档:
http://laravel.com/docs/5.1/migrations
上面我们创建好了articles数据表之后,我们就可以为这个表写一个Model类了,你可以手动创建,也可以使用artisan命令行来创建一个model,比如你在命令行敲php artisan,你会看到make下面会有很多命令,而make:model就是我们需要使用的命令:
就像解释的一样:Create a new Eloquent model class
很多时候,在Laravel中,我们在创建一个model的时候都会有一些约定俗成的命名方法:
如果说我们有一个articles数据表,我们的model相对应就命名为Article;如果说我们有一个users的数据表,我们的model对应就命名为User;
就是基本上遵守数据表复数而model单数大写就可以了。
所以根据这个规律我们来创建我们的Article Model,使用的是make:model命令:
php artisan make:model Article
这样一来,我们的Article Model就创建成功了,这个文件位于blog/app/Article.php,打开之,可以看到我们Laravel为我们生成的内容:
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Article extends Model{ //}
注意到Article这个类是继承与我们的Eloquent\Model 类,由于这个Eloquent\Model类实现了很多非常棒的方法供我们使用,我们可以来愉快地玩耍了。
首先开始玩耍的是,使用 php artisan tinker这个工具来play around,tinker提供了一个Eloquent跟数据库表交互的命令行界面,你可以在上面写一些简单地php操作,比如:
所以,我们来实例化一个Article吧:
$article = new App\Article
这样就相当于我们实例化了一个Article类了,我们可以在后面的操作中进行字段具体化。
在上面我们创建表的时候,我们有以下几个字段:
$table->increments('id');$table->string('title');$table->text('intro');$table->text('content');$table->timestamp('published_at');$table->timestamps();
于是我们可以用tinker来设置以下上面的$article的各个字段,就如设置属性一样简单。
比如设置$article的title可以这样:
$article->title = 'Router Views Controllers';
同理,我们也可以将intro和content字段设置:
$article->intro = 'Article 1 Intro';$article->content = 'Article 1 Content';
不过这里需要注意的是published_at这个字段,这里我推荐使用一个很棒的时间处理库Carbon,因为像created_at和 updated_at这两个字段也是使用的Carbon类,这样在后面的处理中,我们会有很多好处,这里我们先直接使用Carbon:
$article->published_at = Carbon\Carbon::now();
而对于$table->timestamps()这个,Laravel会在我们插入数据的时候自动完成的,所以这里我们每个字段都赋值完毕之后,我们可以使用Eloquent的save()方法来向数据库的articles表插入一条数据了:
$article->save();
返回一个true的时候,表示我们成功插入数据了,我们来看看数据库:
以上,就是一个简单而完整的使用tinker给Eloquent赋值的玩耍过程。
下面我们再来玩耍一会:
all()方法会返回Article的所有记录:
$articles = App\Article::all();
find(),接受一个参数$id,比如查找id为1的一条记录:
$article = App\Article::find(1);
你也可以传入一个$id的数组,查找多条记录,不过这里我们只有一条数据,所以就这样了。不过我们也可以这样玩玩:
将一个Eloquent的对象转为数组:
$article = App\Article::find(1)->toArray();
将一个Eloquent的对象转为json字串:
$article = App\Article::find(1)->toJson();
如果就简简单单这样的话,Eloquent也不能算很强大,我们在写代码过程中的where语句呢,这个也没有么?
不用担心,这个马上就有:
$article = App\Article::where('title','=','Router Views Controllers')->get();
在使用where()的时候,往往需要用get()来获取记录集,这个返回的是一个Eloquent\Collection结果集,但是如果我就是想要满足条件的第一天记录呢,不需要结果集呢?
使用first()方法,在上面的基础上,get()换成first():
$article = App\Article::where('title','=','Router Views Controllers')->first();
到这里,一些简单地查找工作就可以告一段落了,而对于update呢,我们可以这样:
$article = App\Article::find(1);$article->intro = 'Article 1 Intro Update!';$article->save();
我们来看看有没有更新:
$article = App\Article::find(1);
也可以使用update()方法:
$article->update(['content'=>'Article 1 Content Update']);
正常情况下我们会得到一个MassAssignmentException with message:
文档看这里: http://laravel.com/docs/5.1/eloquent#mass-assignment
这个是因为Eloquent默认是不允许我们直接更新我们的数据的,这是出于可能出现数据覆盖的情况,但是如果我们确实是先要实现这样的功能,我们可以在Article这个model文件里面加一个$fillable数组:
class Article extends Model{ protected $fillable = ['content'];}
然后再执行一次看看:
这里需要Ctrl + C 退出tinker在重新进来一次。
查找,更新之后,借着我们在聊到MassAssignment这个概念的时候,我们可以来聊聊create()这个方法了,这个方法可以在不用声明new Article()的情况下创建一条数据,比如:
App\Article::create(['title'=>'Article 2','intro'=>'intro 2','content'=>'Article 2 content','published_at'=>Carbon\Carbon::now()]);
然后我们会看到一个奇怪的现象,我们并没有得到我们想要的结果:
我们只有content这个字段正确有了值,title,intro,published_at都没有值,这是为什么了?其实也是因为MassAssignment的缘故,我们可以参照content的时候,在Article里面的$fillable设置我们的可以填充的字段:
class Article extends Model{ protected $fillable = [ 'title', 'intro', 'content', 'published_at' ];}
然后再执行一次:
成功创建了一条数据,然后我们发现第二条其实并不是我们想要的,我们来删除它:
使用delete()方法:
$article = App\Article::find(2);$article->delete();
我们用all()来检查一下:
这里也可以使用destroy(),这个方法可以接受一个$id或者一个数组$ids:
App\Article::destroy(3);
最后还是放一下官方文档:http://laravel.com/docs/5.1/eloquent
到这里基本的Eloquent也就介绍到这里了,鉴于这一节说了Model,前面也都接触过Views和Controllers,下一节打算说说Model Views Controllers的基本流程。
Happy Hacking