【问题标题】:Laravel multiple controller functions one routeLaravel 多控制器功能一条路线
【发布时间】:2018-11-26 15:35:44
【问题描述】:

我想要实现的是通过@foreach 发布所有新闻,并在@foreach 之间执行另一个@foreach 以发布具有新闻帖子中ID 的所有cmets。

我不确定如何将此 ID 传递给 getNewsComments 函数。

我的控制器:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use DB;
use App\News;
use App\newsComments;


class newsController extends Controller
{
    public function getAllNews(){
        $results = News::all();
        return view('index')->with('news', $results);
    }
}

路线:

Route::get('/', 'newsController@getAllNews');

新闻模型:

class News extends Model
{
    // set table
    protected $table = 'lg_news';


    public function newsComments(){
        return $this->hasMany('App\newsCommments');
    }
}

评论模型:

class newsComments extends Model
{
    // set table name
    protected $table = 'lg_newscomments';

}

查看

@foreach ($news as $article)

  @foreach($news->$newsComments as $comment)
  @endforeach
@endforeach

错误:

未定义变量:newsComments(查看: C:\xampp\htdocs\resources\views\index.blade.php)

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    你不需要多条路线,你只需要有两个以 1:N 关系相互关联的表

    文章 (1) -> 评论 (N)

    然后您将为每个表创建一个模型并创建关系,如 Laravel 文档中所述

    One to Many relationship in Laravel

    然后您将获取所有帖子并将它们传递给视图:

    public function getAllArticles()
    {
     $posts = Post::all();
     return view('view-name', $posts);
    }
    

    最后,创建一个视图并显示帖子和 cmets:

        @foreach($posts as $post)
         {{ $post->title }}
         {{ $post->body }}
         @foreach($post->comments as $comment)
          {{ $comment->title }}
          {{ $comment->body }}
         @endforeach
        @endforeach
    

    提醒:$post->commentscmets是你创建关系的模型中定义的方法名

    在 web.php 中定义路由:

    Route::get('/', 'ControllerName@getAllArticles');
    

    转至localhost:8000/(如果网站是托管的,则转至您的网站域)查看结果

    【讨论】:

    • 我一直在搞乱它,但我没有让它工作。一个问题:Route::get('/post/{id}', 'ControllerName@methodName')->name('route-name');如果您访问 url /post/'id',这条路线是否只会获得帖子?因为我需要它在我的索引页面上,而不是在单独的页面上。
    • ControllerName 是您定义方法的控制器,methodName 是方法名称本身。例如,如果您的控制器称为 ArticleController 并且该控制器内部的方法称为 getArticleById 您必须像这样定义路由 Route::get('/article/{id}', 'ArticleController@getArticleById');并且 URL 地址是 localhost:8000/article/1 (将显示 id 等于 1 的帖子)
    • 是的,我明白了。但是执行 /article/{id} 并不意味着您实际上必须“访问” www.website.com/article/23(例如)?我想要实现的是在索引页面上添加新闻 + cmets aswel。
    • 没错!请参阅我刚刚编辑的答案:) 如果它帮助您解决问题,请将其标记为正确。祝你好运
    • 我想要实现的是在索引页面上添加新闻 + cmets aswel,而无需导航到 www.website.com/article/1。所以它只是显示新闻的 www.website.com + 新闻评论,如果我不够清楚,请见谅。
    【解决方案2】:

    改变这一行:

    return view('index')->with('news', $results);
    

    return view('index', ['news' => $results]);
    

    它可能会起作用。

    PS:with() 函数会设置一个会话!它不会将变量传递给视图。

    【讨论】:

    • 得到同样的错误:未定义变量:newsComments(查看:C:\xampp\htdocs\resources\views\index.blade.php)
    • 将该方法名称更改为 cmets(因为我们在视图页面中使用 $post->cmets 引用该方法)并且它将起作用
    • 你是说这个? @foreach($news->$newsComments as $comment) - 如果我将其更改为 @foreach($news->$cmets as $comment) 它会给我同样的错误,但使用 cmets。
    • 去掉 cmets 前面的 $ 符号!需要@foreach($news->cmets as $comment) 提醒:并且一定要把News模型中的方法名重命名为cmets而不是newComments,这样可以解决你的问题
    • 此集合实例上不存在属性 [cmets]。我删除了 $ 并将方法更改为 public function cmets()
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2017-07-09
    • 2020-02-27
    • 2021-09-06
    • 1970-01-01
    • 2018-01-09
    • 2017-06-09
    • 2015-01-23
    相关资源
    最近更新 更多