关闭。这个问题需要详细或明确。它目前不接受答案。
**想改进这个问题吗?**编辑这篇文章,添加细节并澄清问题。
22小时前关门。
改进这个问题
我在电子商务网站工作。我只想做,如果有人在商店页面上点击任何产品,它将获得产品id以获得产品数据。但是在url中显示产品名称而不是产品id,就像这样
Route::get('product/{product_id}','ProductController@getProductDetail');
<a href="/product/product_id">Product Name</a>
www.example.com/product/product_name
我该怎么做
2条答案
按热度按时间1l5u6lss1#
在laravel中使用模型绑定时,可以选择要搜索的模型字段。不过,该字段必须是唯一的。
这就是为什么人们要求你在评论你的问题时用鼻涕虫。
假设你加上这个
slug
产品表上的字段:现在,当人们询问产品时,请laravel在slug字段中搜索,而不是使用id:
现在,打电话
GET /product/my-super-product
将导致控制器的功能,您有预期的产品。kiayqfof2#
您需要使用隐式绑定:https://laravel.com/docs/7.x/routing#implicit-装订
正如文件明确指出的那样:
Laravel automatically resolves Eloquent models defined in routes or controller actions whose type-hinted variable names match a route segment name.
现在您正在使用{product_id}
在路线定义和getProductDetail($product_id){...}
你收到的方法$product_id
参数,并可能使用以下内容获取您的产品Product::find($product_id)
所以,像这样的事情;但是通过隐式绑定,您可以注入
$product
对象直接指向您的方法。首先更新路线(仅用于正确的参数命名):
然后,您可以更新控制器方法:
在一个例子中;访问时:
yoursite.com/products/3
laravel会自动从以下位置获取产品:id
等于3
. 它使用id
默认情况下为列,但如果要使用其他列,可以替代它。所以你需要一个
slug
在您的products
将产品名称存储为slug的表。还要确保slug
列是unique
. 所以也许你可以把这一行添加到你的create_products_table
迁移;创建新产品时,必须设置产品的
slug
. 您可以使用str::slug()帮助程序:https://laravel.com/docs/7.x/helpers#method-str弹头现在,一切都准备好了,您可以根据需要覆盖默认routekey
slug
在您的模型中(可能是app/Models/Product.php
)您需要添加一个getRouteKeyName()
方法并返回您喜欢的列名:现在,您的路线将与产品的slug顺利配合。
yoursite.com/products/3
大概是yoursite.com/products/iphone-12-128gb-purple
拉威尔会照顾好一切;由于隐式绑定。