目次
データベースに接続した後、Laravel を使用する前に、対応するデータ テーブルを作成する必要があります。ブログ プロジェクトの場合は、手動でデータ テーブルを直接作成した可能性があります。データベースに記事データテーブルを手動で作成しますが、Laravel プロジェクトでは移行を使用することを強くお勧めします。これにはどのような利点がありますか?実際、Migration は、プロジェクト ファイルの Git のバージョン管理と同じように、データベースのバージョン管理ツールと考えることができ、ロールバックやリセットなどが可能です。これにより、コードの実装とコマンド ライン管理を組み合わせることができます。データベースで、blog/ ディレクトリのコマンドラインで php 職人を実行すると、ここで説明しているロールバックとリセットが次のように表示されます。
使用Eloquent
all()方法
toArray()方法:
toJson()方法
where()方法
下一节
ホームページ バックエンド開発 PHPチュートリアル Laravel 5 チュートリアル シリーズ 4: データベースと Eloquent

Laravel 5 チュートリアル シリーズ 4: データベースと Eloquent

Jun 20, 2016 pm 12:50 PM

原文: 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 ファイルを直接作成し、対応する構成項目を書き込むことができます。

これで完了です。情報が正しく設定されていれば、最初にホームステッド データベースを作成する必要があります。

移行を使用する

データベースに接続した後、Laravel を使用する前に、対応するデータ テーブルを作成する必要があります。ブログ プロジェクトの場合は、手動でデータ テーブルを直接作成した可能性があります。データベースに記事データテーブルを手動で作成しますが、Laravel プロジェクトでは移行を使用することを強くお勧めします。これにはどのような利点がありますか?実際、Migration は、プロジェクト ファイルの Git のバージョン管理と同じように、データベースのバージョン管理ツールと考えることができ、ロールバックやリセットなどが可能です。これにより、コードの実装とコマンド ライン管理を組み合わせることができます。データベースで、blog/ ディレクトリのコマンドラインで php 職人を実行すると、ここで説明しているロールバックとリセットが次のように表示されます。

ここで移行を使用することに納得していない場合は、基本的に赤いボックスが最も一般的に使用されます。

まず、移行ファイルを作成します。これは、スキーマを定義します。テーブル、コマンドライン実行:

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

使用Eloquent

上面我们创建好了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()方法

all()方法会返回Article的所有记录:

$articles = App\Article::all();
ログイン後にコピー

find(),接受一个参数$id,比如查找id为1的一条记录:

$article = App\Article::find(1);
ログイン後にコピー
ログイン後にコピー

你也可以传入一个$id的数组,查找多条记录,不过这里我们只有一条数据,所以就这样了。不过我们也可以这样玩玩:

toArray()方法:

将一个Eloquent的对象转为数组:

$article = App\Article::find(1)->toArray();
ログイン後にコピー

toJson()方法

将一个Eloquent的对象转为json字串:

$article = App\Article::find(1)->toJson();
ログイン後にコピー

如果就简简单单这样的话,Eloquent也不能算很强大,我们在写代码过程中的where语句呢,这个也没有么?

不用担心,这个马上就有:

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? Apr 17, 2025 am 12:06 AM

PHPでは、Password_hashとpassword_verify関数を使用して安全なパスワードハッシュを実装する必要があり、MD5またはSHA1を使用しないでください。 1)password_hashセキュリティを強化するために、塩値を含むハッシュを生成します。 2)password_verifyハッシュ値を比較して、パスワードを確認し、セキュリティを確保します。 3)MD5とSHA1は脆弱であり、塩の値が不足しており、最新のパスワードセキュリティには適していません。

スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか? スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか? Apr 17, 2025 am 12:25 AM

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

PHPおよびPython:さまざまなパラダイムが説明されています PHPおよびPython:さまざまなパラダイムが説明されています Apr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPおよびPython:コードの例と比較 PHPおよびPython:コードの例と比較 Apr 15, 2025 am 12:07 AM

PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

PHPでのSQL注入をどのように防止しますか? (準備された声明、PDO) PHPでのSQL注入をどのように防止しますか? (準備された声明、PDO) Apr 15, 2025 am 12:15 AM

PHPで前処理ステートメントとPDOを使用すると、SQL注入攻撃を効果的に防ぐことができます。 1)PDOを使用してデータベースに接続し、エラーモードを設定します。 2)準備方法を使用して前処理ステートメントを作成し、プレースホルダーを使用してデータを渡し、メソッドを実行します。 3)結果のクエリを処理し、コードのセキュリティとパフォーマンスを確保します。

PHP:データベースとサーバー側のロジックの処理 PHP:データベースとサーバー側のロジックの処理 Apr 15, 2025 am 12:15 AM

PHPはMySQLIおよびPDO拡張機能を使用して、データベース操作とサーバー側のロジック処理で対話し、セッション管理などの関数を介してサーバー側のロジックを処理します。 1)MySQLIまたはPDOを使用してデータベースに接続し、SQLクエリを実行します。 2)セッション管理およびその他の機能を通じて、HTTPリクエストとユーザーステータスを処理します。 3)トランザクションを使用して、データベース操作の原子性を確保します。 4)SQLインジェクションを防ぎ、例外処理とデバッグの閉鎖接続を使用します。 5)インデックスとキャッシュを通じてパフォーマンスを最適化し、読みやすいコードを書き、エラー処理を実行します。

PHPの目的:動的なWebサイトの構築 PHPの目的:動的なWebサイトの構築 Apr 15, 2025 am 12:18 AM

PHPは動的なWebサイトを構築するために使用され、そのコア関数には次のものが含まれます。1。データベースに接続することにより、動的コンテンツを生成し、リアルタイムでWebページを生成します。 2。ユーザーのインタラクションを処理し、提出をフォームし、入力を確認し、操作に応答します。 3.セッションとユーザー認証を管理して、パーソナライズされたエクスペリエンスを提供します。 4.パフォーマンスを最適化し、ベストプラクティスに従って、ウェブサイトの効率とセキュリティを改善します。

PHPとPythonの選択:ガイド PHPとPythonの選択:ガイド Apr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

See all articles