摘要:至于一對一和一對多這兩種關系,可以觸類旁通。注意文件的下載或來源,請自行獲取。接下來,我們使用取得文章的標簽,這個就是我們聲明多對多關系的方法。
免費視頻教程地址 https://laravist.com/series/laravel-5-basic原文來自 https://laravist.com/article/18
Laravist是我剛剛上線的Laravel社區,有任何與Laravel相關的問題可以到這里來問我,我會盡力去幫大家解決問題,后期會嘗試錄制一些視頻教程,形式大概是這樣的
https://laravist.com/lesson/1
前奏在開始正文之前,我們首先來說說在實際的開發中,經常會接觸到幾種常見的對應關系模式:
One-To-One //一對一 One-To-Many //一對多 Many-To-Many //多對多
不知道你對這些概念是一種什么樣的感受,如果是不太理解的。你可以將這些概念應用到生活中,理解起來就很簡單了,就舉一個與我們在網上經常見到的例子:
User-To-Profile // One-To-One User-To-Articles // One-To-Many Article-To-Comments // One-To-Many Articles-To-Tags // Many-To-Many
翻譯過來就是:
一個用戶對應一個用戶檔案
一個用戶可以發表多篇文章
一篇文章可以有多個評論
而文章和標簽確實多對多的關系,一篇文章可以有多個標簽;一個標簽可以屬于多篇文章
在這些關系模型中,最難實現的就是Many-To-Many這種多對多的關系,但是我們這個簡單地博客并沒有用戶管理,也就是并沒有開放讓用戶注冊,所以我們在這里還是要挑戰一下難度,實現Articles-To-Tags這種Many-To-Many關系,借助Laravel的強大的Eloquent,實現這個功能還是比較順心的。至于一對一和一對多這兩種關系,可以觸類旁通。
創建tags表要實現Articles-To-Tags這種Many-To-Many關系,我們需要tags表和Tag模型,所以我們分別來創建之。
php artisan make:migration create_tags_table --create=tags
打開生成的migration文件,為up()方法增加一行代碼:
public function up() { Schema::create("tags", function (Blueprint $table) { $table->increments("id"); $table->string("name"); $table->timestamps(); }); }
這里我們增加了$table->string("name");這一行,這個字段表示為tags table添加一個name字段,代表標簽的名字。
接下來,我們為tags表創建一個Tag模型:
php artisan make:model Tag
生成了Tag模型之后,我們先不用去管Tag.php文件,因為我們還需要一張關系表article_tag,這個表只存tag_id和article_id,所以我們來創建之:
php artisan make:migration create_article_tag_table --create=article_tag
打開migration文件來為之加上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(); }); }
這里貌似就添加tag_id和article_id這兩個字段,但是用了很多行代碼,我們只要是理解下面這個:
$table->foreign("article_id")->references("id")->on("articles")->onDelete("cascade");
foreign():外鍵
references():參照字段
on():參照表
onDelete():刪除時的執行動作
這里是跟著刪除,比如刪除了某篇文章,我們將article_tag中包含article_id一樣的記錄也刪除
最后,執行migration生成article_tag表:
php artisan migrate
OK,生成這兩個表之后,我們就可以正式開始我們的工作了。
聲明Eloquent的關系Articles和Tags是多對多的關系,所以我們需要在Article.php中聲明下面的關系:
public function tags() { return $this->belongsToMany("AppTag"); }
在Tag.php,也同樣:
public function articles() { return $this->belongsToMany("AppArticle"); }
我們使用$this->belongsToMany()來表明Eloquent的關系,這里需要注意的是如果你的外鍵并不是article_id和tag_id,你需要在第三個參數進行設置,寫成類似下面這樣:
public function articles() { return $this->belongsToMany("AppArticle","conversation_id"); }
OK,這樣,我們的多對多關系就聲明完畢了。
使用Select2在開始之前,我們使用tinker生成幾個tag,過程就不演示了,最后是這樣的:
然后,為了更好地用戶體驗,我們引入Select2,這個對選擇多個選項的時候表現得異常完美。
Select2 用法:https://select2.github.io/examples.html
我們在app.blade.php引入Select2的css文件和js文件:
在
標簽內,我們還引入了jquery,因為select2依賴于jquery,所以。注意文件的下載或來源,請自行獲取。引入之后,我們就可以在文件創建的頁面依舊使用我們的Form來生成我們的選擇框了,來到articles/create.blade.php文件,在published_at下面添加一個輸入表單:
{!! Form::label("tag_list","選擇標簽") !!} {!! Form::select("tag_list[]",$tags,null,["class"=>"form-control js-example-basic-multiple","multiple"=>"multiple"]) !!}
這里需要注意的是tag_list[],如果我們只是使用tag_list,就只能選到一個標簽,如果我們需要選擇多個,我們需要已數組的形式來儲存我們的標簽,還有一個就是指定一下"multiple"=>"multiple",就是開啟支持多選模式。然后$tags就是我們需要從數據庫獲tags表取到得數據,所以自然而然,我們到ArticleController中的create()方法中,稍微修改一下代碼:
public function create() { $tags = Tag::lists("name", "id"); //為了在界面中顯示標簽name,id為了在保存文章的時候使用。 return view("articles.create",compact("tags")); }
這里我們使用lists()方法將Tag中(對于tags數據表)name和id以一個Eluqoent的方式返回,你可以使用dd($tags),來看看。恩,這個時候來看看我們的create頁面:
這時候我們發現,樣式并沒有Select2那么好看,那是因為我們還沒有初始化Select2,所以我們在create.blade.php寫幾行簡單地js代碼:
在@endsection緊接著的上一行加上上面的代碼,這里我們使用jquery的選擇器,然后調用select2();來初始化我們的選擇框,再來看看效果:
很完美,我們將整個UI完善得還不錯,我們用dd();來看看我們表單提交過來的是什么,在ArticleController中的store()方法中添加一行代碼:
dd($request->all());
我們來看看效果:
我們看到得tag_list是一個數組,里面的值并不是我們選擇的標簽的name,而是標簽的id,這樣我們就可以使用laravel提供的attach()來添加我們的標簽了,這個attach()接受一個id的數組,這里正好!,所以我們來稍微來修改一下store()方法:
public function store(RequestsStoreArticleRequest $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("AppTag")->withTimestamps(); }
我們在后面直接使用withTimestamps()來同步我們的時間,我們再來試一試:
再來看看我們的數據庫:
看到最后的兩個記錄,很完美。
在視圖中顯示我們的tags我們既然有了標簽,我們為什么不來將它展示出來呢?在articles/index.blade.php中,我們來將文件的標簽輸出一下:
{{ $article->title }}
我們在標簽下面增加一個列表,然后是首先將發表日期published_at輸出了,這里我們使用了Carbon的diffForHumans()方法,這個方法就會產生幾分鐘之前,幾個小時之前的效果,這里也可以體會我們之前需要將published_at這個對象作為Carbon對象來對待了,如果是簡單地字符串,是不能調用Carbon的diffForHumans()方法的。
接下來,我們使用$article->tags取得文章的標簽,這個tags就是我們聲明多對多關系的tags()方法。我們來看看效果:
我們發現我們的多少分鐘之前都是英文,那是因為我們沒有設置Carbon,我們來修復一下,在app/Providers/AppServiceProvider.php中的boot()方法添加下面這一行:
CarbonCarbon::setLocale("zh");
然后刷新,見證一下奇跡吧:
總結到這里我們利用laravel提供的attach()方法將基本的多對多關系實現了,并且還稍微美化了一下輸出,將published_at字段完美呈現。接下來我打算說一說怎么實現修改文章了,這是一個必走的流程嘛。所以。。。
最后,Happy Hacking
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21125.html
摘要:來看看具體的步驟注冊路由在中,注冊我們的編輯頁面的路由這個路由接受一個參數,意為文章的,我們會需要根據這個來查詢我們要修改的文章。然后渲染視圖,并將查詢到的和傳給視圖。下面我打算再開一個系列說說的新特性 原文來自https://laravist.com/article/20 免費視頻教程地址 https://laravist.com/series/laravel-5-basic La...
摘要:原文發表在我的個人網站系列入門教程四最適合中國人的教程本教程示例代碼見大家在任何地方卡住,最快捷的解決方式就是去看我的示例代碼。 原文發表在我的個人網站:Laravel 5 系列入門教程(四)【最適合中國人的 Laravel 教程】 本教程示例代碼見:https://github.com/johnlui/Learn-Laravel-5 大家在任何地方卡住,最快捷...
摘要:原文發表在我的個人網站系列入門教程一最適合中國人的教程本教程示例代碼見大家在任何地方卡住,最快捷的解決方式就是去看我的示例代碼。在此我推薦一個全量中國鏡像。 原文發表在我的個人網站:Laravel 5 系列入門教程(一)【最適合中國人的 Laravel 教程】 本教程示例代碼見:https://github.com/johnlui/Learn-Laravel-5 大...
摘要:本文來自原文鏈接歡迎作客我們的學習群最簡單的,里得到的是一組數據,得到的是一個數據。 本文來自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學習群:109256050 最簡單的,laravel里get()得到的是一組數據,first()得到的是一個model數據。 從形式上,laravel里每一個model數據(record),在取出的時候都是用的PH...
摘要:原文來自免費視頻教程地址上一篇寫了一些的基本用法和給視圖傳遞變量的幾種方式,這一節我們來說說跟數據庫打交道的數據庫配置和強大的。 原文來自: https://jellybool.com/post/programming-with-laravel-5-database-and-eloquent-model 免費視頻教程地址 https://laravist.com/series/lara...
閱讀 2216·2021-09-07 09:58
閱讀 3391·2019-08-30 14:07
閱讀 1305·2019-08-29 12:32
閱讀 667·2019-08-29 11:06
閱讀 3692·2019-08-26 18:18
閱讀 3731·2019-08-26 17:35
閱讀 1381·2019-08-26 11:35
閱讀 611·2019-08-26 11:35