首先我们来了解一下Laravel
模型,Laravel
中是有两种集合,一个是 BaseCollection
,一个是 EloquentCollection
。后者继承前者,而且对部分方法进行了重载。分清楚之间的细微区别,可以让你在编程中不迷惑。
本文从一整套的例子,从数据库建表,写模型,写控制器,到模板渲染,从一个小bug
,讲到集合的深层次原因。
学习时间
首先创建数据库表,我们不使用迁移,直接上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
编码。
然后创建模型 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)
大家思考一下,这个故障是如何发生的?下一节我们给出解答。
正确写法
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
的细微区别,希望能对大家有所帮助。想了解更多的同学可以看一下教程
Laravel 5中文文档:https://www.w3cschool.cn/qpmsiw/
Laravel入门到实战:https://www.w3cschool.cn/minicourse/play/laravelpre
文章参考来源:www.toutiao.com/a6855259233106002440/