Laravel 搭建商城之学习笔记(第五章)

生成测试数据

  • 创建模型
php artisan make:model Models/Test -mf
  • 配置工厂文件
    database/factories/TestFactory.php
<?php
use Faker\Generator as Faker;
$factory->define(App\Models\Test::class, function (Faker $faker) {
    $image = $faker->randomElement([
        "url1.jpg",
        "url2.jpg",
        "url3.jpg",
    ]);

    return [
        'filed1' => $faker->word,
        'filed2' => $faker->sentence,
        'image'  => $image,
        'filed3' => true,
        'filed4' => $faker->numberBetween(0, 5),
        'filed5' => 0,
    ];
});
  • 创建一个 Seeder 文件用来批量生成数据
php artisan make:seeder TestsSeeder

database/seeds/TestsSeeder.php

.
.
.
    public function run()
    {
        // 创建 30 个数据
        $products = factory(\App\Models\Test::class, 30)->create();
    }
  • 最后我们执行这个 Seeder:
php artisan db:seed --class=TestsSeeder

动态构建查询 SQL

一下为产品搜索案例,其中 skus 属于子表,一对多

.
.
.
    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);
                    });
            });
        }

        $products = $builder->paginate(16);

        return view('products.index', ['products' => $products]);
    }

这里详细解释一下模糊搜索那段代码,我们这里的实现是先用 $builder->where() 传入一个匿名函数,然后才在这个匿名函数里面再去添加 like 搜索,这样做目的是在查询条件的两边加上 (),也就是说最终执行的 SQL 语句类似 select * from products where on_sale = 1 and ( title like xxx or description like xxx ),试想如果我们直接用下面的代码:

$like = '%'.$search.'%';
$builder->where('title', 'like', $like)
    ->orWhere('description', 'like', $like)
    ->orWhereHas('skus', function ($query) use ($like) {
        $query->where('title', 'like', $like)
            ->orWhere('description', 'like', $like);
    });

那么生成的 SQL 就会变成 select * from products where on_sale = 1 and title like xxx or description like xxx,这个 SQL 会把 on_sale = 0 但 description 包含搜索词的商品也搜索出来,这不符合我们的期望。

258 total views, 2 views today

Revisions

There are no revisions for this post.

No comments yet.

发表评论