首先我們來(lái)了解一下Laravel
模型,Laravel
中是有兩種集合,一個(gè)是 BaseCollection
,一個(gè)是 EloquentCollection
。后者繼承前者,而且對(duì)部分方法進(jìn)行了重載。分清楚之間的細(xì)微區(qū)別,可以讓你在編程中不迷惑。
本文從一整套的例子,從數(shù)據(jù)庫(kù)建表,寫(xiě)模型,寫(xiě)控制器,到模板渲染,從一個(gè)小bug
,講到集合的深層次原因。
學(xué)習(xí)時(shí)間
首先創(chuàng)建數(shù)據(jù)庫(kù)表,我們不使用遷移,直接上SQL
。
CREATE TABLE `about`(
`id` int(10) UNSIGNED NOT NULL,
`title` varchar(500) COLLATE utf8_unicode_ci NOT NULL,
`content` text COLLATE utf8_unicode_ci,
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
只有3列,一個(gè)是主鍵,一個(gè)是標(biāo)題,一個(gè)是文本內(nèi)容。注意數(shù)據(jù)庫(kù)字段,表,均聲明了utf-8
編碼。
然后創(chuàng)建模型 About
,指定表名,我們此處略去,直接看控制器的一個(gè)方法:
public function index()
{
$about = About::where('title', 'about-me')->get(); //id = 3
return view('about', compact('about'));
}
SQL
查詢條件是根據(jù)標(biāo)題返回所有的條目,然后將結(jié)果集通過(guò) view
視圖進(jìn)行渲染。
然后重點(diǎn)來(lái)了,視圖內(nèi)這樣寫(xiě)大家看會(huì)不會(huì)有問(wèn)題???
@section('title')
{{$about->title}}
@stop
@section('content')
{!! $about->content !!}
@stop
如果不出意外,開(kāi)啟 debug = true
訪問(wèn)該頁(yè)面時(shí),你大概率會(huì)得到下面的錯(cuò)誤提示:
Property [title] does not exist on this collection instance.
(View: E:\laragon\www\newsite\resources\views\about.blade.php)
大家思考一下,這個(gè)故障是如何發(fā)生的?下一節(jié)我們給出解答。
正確寫(xiě)法
Laravel
模型的get()
方法返回一個(gè)集合(EloquentCollection
)。如果需要使用集合的屬性,你首先需要進(jìn)行遍歷。像下面這樣在視圖文件內(nèi)寫(xiě):
@foreach ($collection as $object)
{{ $object->title }}
@endforeach
EloquentCollection
內(nèi)的每一個(gè)元素,都是一個(gè) About Model
對(duì)象。所以可以使用 $object->title
獲取到title
屬性。
如果你的需求很簡(jiǎn)單,就是要第一個(gè)元素的標(biāo)題,簡(jiǎn)寫(xiě)如下:
{{ $collection[0]->title }}
如果你要獲取集合內(nèi)的第一個(gè)元素,使用 first 方法:
{{ $collection->first() }}
深入一步
我們知道了問(wèn)題來(lái)自 get()
方法,那么,如果要獲取查詢數(shù)據(jù)集的第一條數(shù)據(jù),應(yīng)該用哪個(gè)呢?find()
或者first()
!
都會(huì)返回一個(gè) About Model
對(duì)象,在視圖中就可以愉快地寫(xiě):
{{ $object->title }}
本文通過(guò)實(shí)際的例子,講解了laravel
模型中查詢數(shù)據(jù)結(jié)果集的 find get first
的細(xì)微區(qū)別,希望能對(duì)大家有所幫助。想了解更多的同學(xué)可以看一下教程
Laravel 5中文文檔:http://hgci.cn/qpmsiw/
Laravel入門(mén)到實(shí)戰(zhàn):http://hgci.cn/minicourse/play/laravelpre
文章參考來(lái)源:www.toutiao.com/a6855259233106002440/