📜  嵌套资源 laravel - PHP (1)

📅  最后修改于: 2023-12-03 15:39:22.485000             🧑  作者: Mango

嵌套资源 Laravel - PHP

在 Laravel 中,嵌套资源是指一个资源关系嵌套在另一个资源中。例如,一个文章资源可能包含多个评论资源。在这种情况下,可以使用嵌套资源来管理这些关系,并在单个请求中返回所有相关数据。

路由定义

在 Laravel 中定义嵌套资源的路由非常容易。我们可以使用 Route::resource 方法来定义主资源路由,并在其内部定义嵌套资源路由。下面是一个示例:

Route::resource('posts.comments', 'PostCommentController');

在这个示例中,我们定义了一个名为 posts.comments 的嵌套资源,其主资源是 posts,控制器为 PostCommentController。此路由将创建以下路由:

+--------+------------------------------------------+------------------------+------------------------+-----------------------------------------------+--------------+
| Domain | Method                                   | URI                    | Name                   | Action                                        | Middleware   |
+--------+------------------------------------------+------------------------+------------------------+-----------------------------------------------+--------------+
|        | GET|HEAD                                 | posts/{post}/comments   | posts.comments.index   | App\Http\Controllers\PostCommentController@index   | web          |
|        | POST                                     | posts/{post}/comments   | posts.comments.store   | App\Http\Controllers\PostCommentController@store   | web          |
|        | GET|HEAD                                 | posts/{post}/comments   | posts.comments.show    | App\Http\Controllers\PostCommentController@show    | web          |
|        | PUT|PATCH                                | posts/{post}/comments   | posts.comments.update  | App\Http\Controllers\PostCommentController@update  | web          |
|        | DELETE                                   | posts/{post}/comments   | posts.comments.destroy | App\Http\Controllers\PostCommentController@destroy | web          |
+--------+------------------------------------------+------------------------+------------------------+-----------------------------------------------+--------------+

注意路由参数 post 在 URL 中嵌套在 posts 之后。在控制器方法中,我们可以使用这个参数来查找该帖子的所有评论。

控制器方法

在控制器方法中,我们可以使用 Eloquent 提供的 where 子句和 with 子句来检索嵌套资源的数据。例如,我们可以在 PostCommentController 控制器中编写以下代码:

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;

class PostCommentController extends Controller
{
    public function index(Post $post)
    {
        $comments = $post->comments()->get();

        return response()->json([
            'post' => $post,
            'comments' => $comments,
        ]);
    }
}

在这个示例中,我们使用 Post 模型的 comments 关联来检索该文章的所有评论。然后,我们返回包含文章和评论的 JSON 响应。

视图文件

在视图文件中,我们可以使用 Laravel 提供的 @foreach 指令来遍历嵌套资源的数据。例如,我们可以在 index.blade.php 文件中编写以下代码:

<h1>{{ $post->title }}</h1>

<p>{{ $post->body }}</p>

<h2>Comments</h2>

<ul>
    @foreach ($comments as $comment)
        <li>{{ $comment->body }}</li>
    @endforeach
</ul>

这个示例使用 Blade 模板引擎的 @foreach 指令来遍历所有评论,并在无序列表中显示它们的正文。

结论

嵌套资源是管理资源关系的有用工具。在 Laravel 中,我们可以使用简单的路由和控制器方法来管理这些关系,并使用 Blade 模板引擎来显示数据。