Laravel 5 チュートリアル シリーズ 9: 雄弁な関係
Laravist は私が立ち上げた Laravel コミュニティです。Laravel に関する質問がある場合は、ここに来て質問してください。問題を解決するのに最適です。後でいくつかのビデオチュートリアルを録画してみます。形式はおそらく次のとおりです原文は https://laravist.com/article/18 より
https://laravist.com/lesson/1
前奏曲
本文を始める前に、最初に、実際の開発でよく起こることについて話します。私は、いくつかの一般的な対応パターンに遭遇しました。
One-To-One //一对一One-To-Many //一对多Many-To-Many //多对多
これらの概念をよく理解していない場合、これらの概念についてどう感じているかわかりません。これらの概念を自分の生活に適用するのは非常に簡単です。インターネットでよく見かける例を見てみましょう。
1 人のユーザーが 1 つのユーザー プロファイルに対応します。ユーザーは複数の記事を公開できます1 つの記事に複数のコメントを付けることができます
タグテーブルを作成する
User-To-Profile // One-To-OneUser-To-Articles // One-To-ManyArticle-To-Comments // One-To-ManyArticles-To-Tags // Many-To-Many
php artisan make:migration create_tags_table --create=tags
次に、タグ テーブルのタグ モデルを作成します。
public function up(){ Schema::create('tags', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); });}
タグ モデルを生成した後、tag.php ファイルについて心配する必要はありません。これは、tag_id と のみを保存するリレーションシップ テーブルarticle_tag も必要であるためです。 Article_id なので、作成しましょう:
php artisan make:model Tag
移行ファイルを開き、それに 2 つのフィールド tag_id とarticle_id を追加します:
php artisan make:migration create_article_tag_table --create=article_tag
2 つのフィールド tag_id とarticle_id がここに追加されているようですが、多くのコード行を使用します必要なのは、次のことを理解することだけです:
public function up() { Schema::create('article_tag', function (Blueprint $table) { $table->increments('id'); $table->integer('article_id')->unsigned()->index(); $table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade'); $table->integer('tag_id')->unsigned()->index(); $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); $table->timestamps(); }); }
foreign(): 外部キー
references(): 参照フィールドon(): 参照テーブル
onDelete(): 削除時の実行アクションここに削除が続きます、記事を削除する場合など、article_tag に同じarticle_id を含むレコードも削除します
最後に、移行を実行して、article_tag テーブルを生成します:
$table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade');
OK、これら 2 つのテーブルを生成したら、正式に作業を開始できます。
Eloquent 関係を宣言する
Article と Tags は多対多の関係であるため、Article.php で次の関係を宣言する必要があります:
php artisan migrate
Tag.php でも同じです:
public function tags() { return $this->belongsToMany('App\Tag'); }
$this を使用します- Eloquent の関係を示すための >belongsToMany() ここで注意する必要があるのは、外部キーがarticle_id と tag_id ではない場合、次のように記述して 3 番目のパラメーターに設定する必要があるということです:
public function articles() { return $this->belongsToMany('App\Article'); }
OK , このようにして、多対多の関係が宣言されます。
Select2 を使用します
始める前に、tinker を使用していくつかのタグを生成します。最終的なプロセスは次のようになります。次に、ユーザー エクスペリエンスを向上させるために、多くのタグを備えた Select2 を紹介します。オプションを選択したときのパフォーマンスは非常に完璧でした。
Select2の使い方: https://select2.github.io/examples.html
app.blade.phpでSelect2のcssファイルとjsファイルを紹介します:
public function articles() { return $this->belongsToMany('App\Article','conversation_id'); }
<link rel='stylesheet' href="/css/select2.css" type='text/css' media='all'/><script src="/js/jquery-2.1.0.min.js"></script><script src="/js/select2.full.min.js"></script>
<div class="form-group"> {!! Form::label('tag_list','选择标签') !!} {!! Form::select('tag_list[]',$tags,null,['class'=>'form-control js-example-basic-multiple','multiple'=>'multiple']) !!}</div>
この時点では、スタイルが Select2 ほど美しくないことがわかりました。これは、Select2 をまだ初期化していないためです。そのため、単純に数行を記述します。 create.blade.php jsコード内:
<script type="text/javascript"> $(function() { $(".js-example-basic-multiple").select2({ placeholder: "添加标签" }); }); </script>
在@endsection紧接着的上一行加上上面的代码,这里我们使用jquery的选择器,然后调用select2();来初始化我们的选择框,再来看看效果:
很完美,我们将整个UI完善得还不错,我们用dd();来看看我们表单提交过来的是什么,在ArticleController中的store()方法中添加一行代码:
dd($request->all());
我们来看看效果:
我们看到得tag_list是一个数组,里面的值并不是我们选择的标签的name,而是标签的id,这样我们就可以使用laravel提供的attach()来添加我们的标签了,这个attach()接受一个id的数组,这里正好!,所以我们来稍微来修改一下store()方法:
public function store(Requests\StoreArticleRequest $request) { $input = $request->all(); $input['intro'] = mb_substr($request->get('content'),0,64); $article = Article::create($input); $article->tags()->attach($request->input('tag_list')); return redirect('/'); }
我们这里首先将Article::create($input)赋予$article变量(Eloquent对象),然后使用$article->tags()->attach()来添加标签,并将我们的标签数组传给attach()方法,我们来看看有没有成功:
这里的文章是发表成功了,我们再来看看我们的标签是否添加成功,来看看我们的article_tag表:
是添加了三个标签,但是我们发现这个created_at和updated_at貌似有点问题,我们来修复一下,在Article.php中的tags()方法中:
public function tags() { return $this->belongsToMany('App\Tag')->withTimestamps(); }
我们在后面直接使用withTimestamps()来同步我们的时间,我们再来试一试:
再来看看我们的数据库:
看到最后的两个记录,很完美。
在视图中显示我们的tags
我们既然有了标签,我们为什么不来将它展示出来呢?在articles/index.blade.php中,我们来将文件的标签输出一下:
<h2 class="post-title pad"> <a href="/articles/{{ $article->id }}"> {{ $article->title }}</a></h2><ul class="post-meta pad group"> <li><i class="fa fa-clock-o"></i>{{ $article->published_at->diffForHumans() }}</li> @if($article->tags) @foreach($article->tags as $tag) <li><i class="fa fa-tag"></i>{{ $tag->name }}</li> @endforeach @endif</ul>
我们在
标签下面增加一个列表,然后是首先将发表日期published_at输出了,这里我们使用了Carbon的diffForHumans()方法,这个方法就会产生几分钟之前,几个小时之前的效果,这里也可以体会我们之前需要将published_at这个对象作为Carbon对象来对待了,如果是简单地字符串,是不能调用Carbon的diffForHumans()方法的。 接下来,我们使用$article->tags取得文章的标签,这个tags就是我们声明多对多关系的tags()方法。我们来看看效果:
我们发现我们的多少分钟之前都是英文,那是因为我们没有设置Carbon,我们来修复一下,在app/Providers/AppServiceProvider.php中的boot()方法添加下面这一行:
\Carbon\Carbon::setLocale('zh');
ログイン後にコピー 然后刷新,见证一下奇迹吧:
总结
到这里我们利用laravel提供的attach()方法将基本的多对多关系实现了,并且还稍微美化了一下输出,将published_at字段完美呈现。接下来我打算说一说怎么实现修改文章了,这是一个必走的流程嘛。所以。。。
最后,Happy Hacking
接下来,我们使用$article->tags取得文章的标签,这个tags就是我们声明多对多关系的tags()方法。我们来看看效果:
我们发现我们的多少分钟之前都是英文,那是因为我们没有设置Carbon,我们来修复一下,在app/Providers/AppServiceProvider.php中的boot()方法添加下面这一行:
\Carbon\Carbon::setLocale('zh');
然后刷新,见证一下奇迹吧:
总结
到这里我们利用laravel提供的attach()方法将基本的多对多关系实现了,并且还稍微美化了一下输出,将published_at字段完美呈现。接下来我打算说一说怎么实现修改文章了,这是一个必走的流程嘛。所以。。。
最后,Happy Hacking

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。
