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