求助,回复表为空时的问题

有一个topic模型,对应topics
有一个reply模型,对应repies

需求:

访问http://www.a.com/topic/1时,我希望在页面里显示3条对应的回复,同时有一个按钮点击以后可以打开新页面看到对应话题的所有回复

TopicCotroller

public function show(TestReply $testreply, Request $request)
    {
        //显示对应话题数据
        $testpsies = TestPsy::find($testreply->id);

        //得到相关帖子的回复
        $testreplies = TestReply::where('testpsy_id',$testreply->id)->recent()->paginate(10);

        //ajax翻页
        if ($request->ajax()) {
            $view = view('mobile.layouts._test_reply_list_ajax',compact('testpsies','testreplies'))->render();
            return response()->json(['html'=>$view]);
        }

        return view('mobile.test_replies.show', compact('testpsies','testreplies'));
    }

route

Route::resource('/topicreplies', 'TopicRepliesController', ['only' => ['show', 'store', 'destroy']]);

这时候我发现个问题:

如果repies里是一张空表,或者说只有10条数据,那么访问http://www.a.com/topic/10点击进入http://c.microdesign.cn/testreplies/10会提示404,除非才reply里有一条id=10的数据。

所以,我要怎么处理一下忽略掉id呢

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

推荐你更加简便的写法

首先在两个模型中定义关联关系

class Topic extends Model
{
    public function replies()
    {
        return $this->hasMany(Reply::class);
    }
}
class Reply extends Model
{
    public function Topic()
    {
        return $this->belongsTo(Topic::class);
    }
}

回复和话题各建一个资源性控制器

// 话题
Route::resource("topics", "TopicController");
// 回复
Route::resource("replies", "ReplyController");

话题控制器:

class TopicController extends Controller
{
    public function show(Topic $topic)
    {
        // 加载该话题最新的10条回复
        $latest_replies = $topic->replies()->latest()->limit(10)->get();

        return compact('topic', 'latest_replies');
    }
}

回复控制器里,如果你使用的是前后端分离的方式,只需要编辑 index方法即可:

class ReplyController extends Controller
{
    public function index()
    {
        // 这里可以做一些数据筛选工作
        return Reply::query()->paginate(10);
    }
}

如果是直接渲染页面就不宜使用资源型路由,应重新定义路由携带话题 ID 信息以便筛选回复

Route::get("replies/{topic}", "ReplyController@list");
class ReplyController extends Controller
{
    public function list(Topic $topic)
    {
        return $topic->replies()->paginate(10);
    }
}

善用 Laravel 的关联 :joy: Laravel 为我们定义了很多便捷的方法 不用的话那就失去用 Laravel 的意义了

以上都是伪代码 没有调试过可能有错误

然后回复可能为空的情况 可以使用 默认模型 解决

4年前 评论
wongvio (楼主) 4年前
讨论数量: 2

解决了,路由不要用resource改用get方式,同时controller里最好不要使用show()方法

4年前 评论

推荐你更加简便的写法

首先在两个模型中定义关联关系

class Topic extends Model
{
    public function replies()
    {
        return $this->hasMany(Reply::class);
    }
}
class Reply extends Model
{
    public function Topic()
    {
        return $this->belongsTo(Topic::class);
    }
}

回复和话题各建一个资源性控制器

// 话题
Route::resource("topics", "TopicController");
// 回复
Route::resource("replies", "ReplyController");

话题控制器:

class TopicController extends Controller
{
    public function show(Topic $topic)
    {
        // 加载该话题最新的10条回复
        $latest_replies = $topic->replies()->latest()->limit(10)->get();

        return compact('topic', 'latest_replies');
    }
}

回复控制器里,如果你使用的是前后端分离的方式,只需要编辑 index方法即可:

class ReplyController extends Controller
{
    public function index()
    {
        // 这里可以做一些数据筛选工作
        return Reply::query()->paginate(10);
    }
}

如果是直接渲染页面就不宜使用资源型路由,应重新定义路由携带话题 ID 信息以便筛选回复

Route::get("replies/{topic}", "ReplyController@list");
class ReplyController extends Controller
{
    public function list(Topic $topic)
    {
        return $topic->replies()->paginate(10);
    }
}

善用 Laravel 的关联 :joy: Laravel 为我们定义了很多便捷的方法 不用的话那就失去用 Laravel 的意义了

以上都是伪代码 没有调试过可能有错误

然后回复可能为空的情况 可以使用 默认模型 解决

4年前 评论
wongvio (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!