laravel参数参数

aemubtdh  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(77)

我试图在产品的URL地址中显示参数参数。例如:/product?brand=2&view=5
本讲话分为两部分:

  • 品牌
  • 显示的产品数量

products表(型号名称:Product

| 标题| title |
| --| ------------ |
| iPhoneX| iPhoneX |
| 三星Note8| SamsungNote8 |
| MiRedmi8| MiRedmi8 |
| MiPoco5| MiPoco5 |
| MiX3Pro| MiX3Pro |
| 索尼Z2| SonyZ2 |
| MiX5Pro| MiX5Pro |
| MiX4Pro| MiX4Pro |
| MiX7Pro| MiX7Pro |

brands表(型号名称:Brand

| 姓名| name |
| --| ------------ |
| 索尼| Sony |
| 米| Mi |
| LG| LG |
| 三星| Samsung |
| iPhone| iPhone |

selects表(型号名称:Select

| 品牌标识| brand_id |
| --| ------------ |
| 5| 5 |
| 4| 4 |
| 2| 2 |
| 2| 2 |
| 2| 2 |
| 1| 1 |
| 2| 2 |
| 2| 2 |
| 2| 2 |
我希望通过参数参数显示产品品牌。
输出:/product?brand=2&view=5

3: MiRedmi8
4: MiPoco5
5: MiX3Pro
7: MiX5Pro
8: MiX4Pro

routes/web.php

Route::get('/product', 'ProductController@index');
app/Models/Product.php
class Product extends Model
{
    public $timestamps = false;
}

app/Models/Brand.php

class Brand extends Model
{
    public $timestamps = false;
}

app/Models/Select.php

class Select extends Model
{
    public $timestamps = false;
}

app/Http/Controllers/ProductController.php

public function index()
{
    $view = request()->view ? request()->view : 20;

    $products = Product::orderBy('id', 'DESC')
        ->where(function($query) {
            $brand = Request()->brand;

            if ($brand) {
                $query->Select::where('id', $brand)
                    ->whereIn(['id' => $brand]); 
            }
        })
        ->paginate($view);

    return view('index', compact('products'));
}

resources/views/index.blade.php

@foreach($products as $row)
    {{ $row->id }} : {{ $row->title }}
@endforeach

{{ $products->appends(request()->query())->links() }}

但是它给了我一个错误,说Select不存在:
Eloquent构建器示例上不存在属性[Select]。
如何修复此错误并通过参数参数显示产品品牌?

fivyi3re

fivyi3re1#

你的数据库布局没有意义,如果一个Product有一个Brand,那么就不需要数据透视表了。您的products表应该有一个brand_id列。
然而,使用你现在拥有的东西,第一步是实际定义你的relationships

class Product extends Model
{
    public $timestamps = false;
    public function brands() {
        return $this->hasMany(Brand::class);
    }
}

class Brand extends Model
{
    public $timestamps = false;
    public function products() {
        return $this->hasMany(Product::class);
    }
}

您的Select模型是枢轴模型。它可能甚至不需要是一个模型,但如果是,它应该被定义为Pivot而不是Model

use Illuminate\Database\Eloquent\Relations\Pivot;
class Select extends Pivot
{
    public $timestamps = false;
    public function brand() {
        return $this->belongsTo(Brand::class, relation: __FUNCTION__);
    }
    public function product() {
        return $this->belongsTo(Product::class, relation: __FUNCTION__);
    }
}

那么我想你的控制器应该是这样的。Builder::when()根据其第一个参数的值执行条件查询。因此,如果查询字符串变量被填充,它将搜索并过滤关系以获得适当的值。注意request()->query()是获取查询字符串变量的方法。

public function index()
{
    $view = request()->query("view", 20);

    $products = Product::orderBy("id")
        ->when(
            request()->query("brand"),
            function ($query) {
                $brand = request()->query("brand");
                $query
                    ->with(["brands", fn ($q) => $q->where("id", $brand])
                    ->whereHas("brands", fn ($q) => $q->where("id", $brand);
            },
            function ($query) {
                $query->with("brands");
            }
        )
        ->paginate($view);

    return view('index', compact('products'));
}

相关问题