在控制器方法中传递模型时,如何使用where子句在Laravel中获得结果

在控制器方法中传递模型时,如何使用where子句在Laravel中获得结果,laravel,Laravel,我有一条路线可以通过slug获得一篇文章 路线 而我希望在路由的控制器方法中传递模型 控制器 我的问题是,我怎样才能在路线上通过slug来获得帖子 而不是邮政ID 我知道我可以通过where子句通过slug并获得post //Route Route::get('post/{slug}', 'PostController@details')->name('post.details'); //Controller method public function details($slug) {

我有一条路线可以通过slug获得一篇文章

路线 而我希望在路由的控制器方法中传递模型

控制器 我的问题是,我怎样才能在路线上通过slug来获得帖子 而不是邮政ID

我知道我可以通过where子句通过slug并获得post

//Route
Route::get('post/{slug}', 'PostController@details')->name('post.details');

//Controller method
public function details($slug)
{
    $post = Post::with('slug', $slug)->first();
}

但是我想通过在方法中传递模型来学习同样的方法。

为模型类设置路由键名称

//Post.php
公共函数getRouteKeyName()
{
返回“slug”;
}

这将通知Laravel injector/resolver在获取对象实例时查看在
slug
列中传递的变量。

将路由键名称设置为模型类

//Post.php
公共函数getRouteKeyName()
{
返回“slug”;
}
这将通知Laravel injector/resolver在获取对象实例时查看在
slug
列中传递的变量。

您要做的是

您可以在Post模型中定义
getRouteKeyName
,如下所示

<?php

class Post extends Model
{
    /**
     * Get the route key for the model.
     *
     * @return string
     */
    public function getRouteKeyName()
    {
        return 'slug';
    }
}
然后在你的控制器里

public function details(Post $post)
{
    // it will return post with slug name
    return $post;
}
希望能有帮助

谢谢

你想做的是

您可以在Post模型中定义
getRouteKeyName
,如下所示

<?php

class Post extends Model
{
    /**
     * Get the route key for the model.
     *
     * @return string
     */
    public function getRouteKeyName()
    {
        return 'slug';
    }
}
然后在你的控制器里

public function details(Post $post)
{
    // it will return post with slug name
    return $post;
}
希望能有帮助


谢谢

控制器中的
$post
变量有什么好处?它仅仅是一个
slug
字符串还是别的什么?我正在通过
slug
将您的路由设置为
route::get('post/{post}','PostController@details')->name('post.details')和控制器方法定义为
公共函数细节(Post$Post){}
,这正是我所做的。让我再一次尝试,这就是Laravel如何通过路由绑定获取模型对象。您能否尝试在控制器中使用
$post
变量执行
composer dump autoload
操作?它仅仅是一个
slug
字符串还是别的什么?我正在通过
slug
将您的路由设置为
route::get('post/{post}','PostController@details')->name('post.details')和控制器方法定义为
公共函数细节(Post$Post){}
,这正是我所做的。让我再一次尝试,这就是Laravel如何通过路由绑定获取模型对象。您可以尝试执行
composer dump autoload
不使用id有什么原因吗?Post::with('slug',$slug)->first();将始终返回posts表中的第一个条目,而与slug无关。你的意思是“where”而不是“with”?请共享posts表的迁移文件。不使用id有什么原因吗?Post::with('slug',$slug)->first();将始终返回posts表中的第一个条目,而与slug无关。你的意思是“where”而不是“with”?请共享posts表的迁移文件。感谢您的解释。一个问题。它是否只返回匹配的项目?对于这个愚蠢的问题,我感到很抱歉,但是对于拉雷维尔和route来说,这是一个新的问题。CodeLover还没有测试过,但是它相信它会返回第一个项目。谢谢你的解释。一个问题。它是否只返回匹配的项目?对于这个愚蠢的问题我很抱歉,但是对于拉雷维尔和route来说,这是一个新的问题。我很困惑。@CodeLover还没有测试过,但它相信它会返回第一个项目
public function details(Post $post)
{
    // it will return post with slug name
    return $post;
}