以展示性别单选为例,展示如何通过模型处理固定选项
案例
比如在视图模板中,有如下单选框:
<label class="radio-inline">
<input type="radio" name="Student[sex]" value="10">
未知
</label>
<label class="radio-inline">
<input type="radio" name="Student[sex]" value="20">
男
</label>
<label class="radio-inline">
<input type="radio" name="Student[sex]" value="30">
女
</label>
可见他们的值都是有规律的,且值均为一个整数值。那么我们需要一个方法,将这些值定义成常量,然后输出。
在模型中定义常量
我们回到app/Student.php这个模型中,并在其中定义:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Student extends Model{
// 通过模型处理性别
const SEX_UN = 10; // 性别未知
const SEX_BOY = 20; // 男
const SEX_GRIL =30; // 女
// 定义一个方法,返回所有性别, 如果传入的键,那么就去数组中获取对应的值
public function sex($ind = null)
{
$arr = [
self::SEX_UN => '未知',
self::SEX_BOY => '男',
self::SEX_GRIL => '女'
];
// 当传入的key不是Null
if ($ind !== null) {
// 检测key是否存在,不存在返回未知
return array_key_exists($ind, $arr) ? $arr[$ind] : $arr[self::SEX_UN];
}
return $arr;
}
}
array_key_exists(要搜索的键, 要查询的数组),搜索一个键是否在要查找的数组中。
在控制器中实例化模型,并传入视图中
class StudentController extends Controller
{
public function create(Request $request)
{
// 先实例化上面的Student.php模型
$student = new Student();
// 将实例化的模型传入视图,在视图中就可以调用模型的方法
return view('student.create', [
'student' => $student
]);
}
}
当然也不要忘记在路由中绑定视图:
Route::any('student/create', [
'uses' => 'StudentController@create'
]);
在视图中渲染
使用模型方法获取单条数据
注意,在控制器中,我们可能使用了分页的功能:
$students = Student::paginate(20);
return view('student.index', [
'students' => $students
]);
将分页获取的数据传入了视图模板,那么此时,传入的$students就已经是实例化Student.php模型了,所以我们可以在视图中直接使用:
@foreach($students as $student)
<tr>
<th scope="row">{{ $student->id }}</th>
<td>{{ $student->name }}</td>
<td>
{{--模型的方法,可以通过模型对象调用,在模型对象中添加sex方法,传入性别值--}}
{{ $student->sex($student->sex) }}
</td>
</tr>
@endforeach
接下来我们分析下,$student->id,$student->sex就是取每一行的id列,sex列。如图:
我个人将这里理解成,每一行中除了有这些属性外,还有一个sex()方法,而sex()方法可以通过传入每一行sex列的值去获得对应的中文值。
所以最终的渲染结果:
根据《二》中定义的值,渲染出了未知。
使用模型方法获取全部数据
根据《二》中定义的sex方法,当不传递下标的时候,会返回全部的数组(在《三》种已经将实例化的模型传入了视图):
{{--在student控制器中将模型传入视图 执行模型的方法--}}
@foreach($student->sex() as $ind => $val)
<label class="radio-inline">
<input type="radio" name="Student[sex]" value="{{ $ind }}">
{{ $val }}
</label>
@endforeach
这里的键就是数据表中代表男女的整数值。最终结果: