模型篇:
1.根据数据库部分URL返回完整的URL
public function getImageUrlAttribute() { // 如果 image 字段本身就已经是完整的 url 就直接返回 if (Str::startsWith($this->attributes['image'], ['http://', 'https://'])) { return $this->attributes['image']; } return Storage::disk('public')->url($this->attributes['image']); }
//模板中Laravel 的模型访问器会自动把下划线改为驼峰,所以image_url
对应的就是getImageUrlAttribute
<div class="img"><img src="{{ $product->image_url }}" alt=""></div>
$casts用法:将字段转换为期望的类型,目前可转换为以下类型: integer, real, float, double, string, boolean, object,array,collection,date,datetime 和 timestamp。
protected $casts = [ 'email_verified_at' => 'datetime', ];
protected $dates = ['last_used_at']; 表示 last_used_at 字段是一个时间日期类型,在之后的代码中 $address->last_used_at 返回的就是一个时间日期对象(确切说是 Carbon 对象,Carbon 是 Laravel 默认使用的时间日期处理类)。
控制器:
1.条件查询与搜索
public function index(Request $request) { // 创建一个查询构造器 $builder = Product::query()->where('on_sale', true); // 判断是否有提交 search 参数,如果有就赋值给 $search 变量 // search 参数用来模糊搜索商品 if ($search = $request->input('search', '')) { $like = '%'.$search.'%'; // 模糊搜索商品标题、商品详情、SKU 标题、SKU描述 $builder->where(function ($query) use ($like) { $query->where('title', 'like', $like) ->orWhere('description', 'like', $like) ->orWhereHas('skus', function ($query) use ($like) { $query->where('title', 'like', $like) ->orWhere('description', 'like', $like); }); }); } // 是否有提交 order 参数,如果有就赋值给 $order 变量 // order 参数用来控制商品的排序规则 if ($order = $request->input('order', '')) { // 是否是以 _asc 或者 _desc 结尾 if (preg_match('/^(.+)_(asc|desc)$/', $order, $m)) { // 如果字符串的开头是这 3 个字符串之一,说明是一个合法的排序值 if (in_array($m[1], ['price', 'sold_count', 'rating'])) { // 根据传入的排序值来构造排序参数 $builder->orderBy($m[1], $m[2]); } } } $products = $builder->paginate(16);
2.查出某个字段,对结果转为布尔类型,场景如某人是否收藏过此产品
$favored = false; if($user = $request->user()){ $favored = boolval($user->favoriteProducts()->find($product->id)); //再传进模板里
HTML篇
1.form表单可以直提交成get形式.
2. 分页后查询的input内容丢失,可将参数加进paginate 如
<div class="float-right">{{ $products->appends($filters)->render() }}</div>
3.下拉式查询
<form action="{{ route('products.index') }}" class="search-form"> <div class="form-row"> <div class="col-md-9"> <div class="form-row"> <div class="col-auto"><input type="text" class="form-control form-control-sm" name="search" placeholder="搜索"></div> <div class="col-auto"><button class="btn btn-primary btn-sm">搜索</button></div> </div> </div> <div class="col-md-3"> <select name="order" class="form-control form-control-sm float-right"> <option value="">排序方式</option> <option value="price_asc">价格从低到高</option> <option value="price_desc">价格从高到低</option> <option value="sold_count_desc">销量从高到低</option> <option value="sold_count_asc">销量从低到高</option> <option value="rating_desc">评价从高到低</option> <option value="rating_asc">评价从低到高</option> </select> </div> </div> </form>
$('.search-form select[name=order]').on('change',function(){ $('.search-form').submit(); })