【问题标题】:SQLSTATE[42S02]: Base table or view not found laravelSQLSTATE[42S02]:未找到基表或视图 laravel
【发布时间】:2016-05-13 10:31:42
【问题描述】:

所以,直接进入问题。有人告诉我,如果我们只想拥有桌子的ids,我们不需要创建pivot table。 laravel 本身可以处理这种情况。我不知道这是如何工作的。我有一张桌子community 和另一张桌子idea。关系是这样的;

一个社区可以包含许多想法,而一个想法可以在许多地方找到 社区。​​p>

想法模型中的关系:

 public function community() {
        return $this->belongsToMany('App\Community')->withTimestamps();
    }

社区模型中的关系:

 public function idea() {
        return $this->belongsToMany('App\idea');
    }

现在我想获取与单个社区相关的所有记录以显示在其页面上假设社区是Arts

这是控制器功能:

 public function showCommunities($id) {
    $community = Community::findOrFail($id)->community()->get();
    return view('publicPages.ideas_in_community', compact('community'));
   }

当我将->community()->get() 附加到Community::findOrFail($id) 时,它会抛出错误

SQLSTATE[42S02]: laravel 未找到基表或视图

任何帮助将不胜感激。

编辑:

从逻辑上讲,这段代码Community::findOrFail($id)->community()->get() 应该是这样的Community::findOrFail($id)->idea()->get()。现在它是真的,但它几乎没有问题。它会引发错误

致命错误:找不到类“App\idea”

【问题讨论】:

  • 你确定上面的代码是正确的吗?您正在尝试使用 Community::findOrFail($id)->community()->get() 从社区获取社区,并且社区模型中没有社区关系。此外,对于多对多关系,您确实需要一个中间表来存储关系。
  • 我不确定这种关系,这就是为什么我将它们发布在这里以获得像你这样的老年人的帮助。有 Laravel 经验的人说,如果我们只想存储他们的 ids laravel 可以自己管理它,我们不需要中间表。我也试过Community::findOrFail($id)->community()->get() 它说App/idea 没有找到。但我已将其包含在@jedrzej.kurylo
  • 您可能误解了对方在说什么。事实上,Laravel 并不要求你定义一个中间模型类,但它确实要求你有一个中间表。我会在一秒钟内发布答案

标签: php laravel laravel-5 eloquent


【解决方案1】:

您定义多对多关系的方式看起来不错 - 我将它们称为 communities()ideas(),因为它们会返回对象的集合,而不是单个对象。

确保您使用正确的类名 - 我可以看到您使用不同的大小写来引用您的模型类 - 请参阅 App\CommunityApp\idea

为了找到相关模型,Eloquent 将在数据透视表中查找匹配的行 - 在您的情况下,它应该命名为 community_idea 并具有 3 个字段:community_ididea_id 和自增主键 id

有了这些,您应该能够通过以下方式获得与给定社区相关联的所有想法:

$ideas = Community::findOrFail($communityId)->ideas;

如果您需要与给定想法相关联的社区,请执行以下操作:

$communities = Idea::findOrFail($ideaId)->communities;

您可以在此处阅读有关如何使用多对多关系的更多信息:https://laravel.com/docs/5.1/eloquent-relationships#many-to-many

【讨论】:

    【解决方案2】:

    有人告诉我,如果我们只想拥有表格的 ID,我们不需要制作数据透视表

    以上说法不正确(除非我误解了)。

    对于多对多 (belongsToMany),它们必须是两个相关表,然后是中间 (pivot) 表。中间表将包含表 1 的主键和表 2 的主键。

    在 laravel 中,主表的命名约定是复数形式,即 Community = 'communities' 和 Idea = 'ideas'。数据透视表名称将派生自相关模型名称的字母顺序,即 community_idea

    现在,如果您不想/不能遵循这些约定,那绝对没问题。更多信息可以参考文档:https://laravel.com/docs/5.2/eloquent-relationships#many-to-many

    一旦您对拥有包含必要字段的必要表格感到满意,您就可以通过以下方式访问关系:

    $ideas = $community->ideas()->get();
    
    //or
    
    $ideas = $community->ideas;
    

    所以你的控制器看起来像:

    public function showCommunities($id)
    {
        $community = Community::findOrFail($id);
    
        //The below isn't necessary as you're passing the Model to a view
        // but it's good for self documentation
    
        $community->load('ideas');
    
        return view('publicPages.ideas_in_community', compact('community'));
    }
    

    或者,您可以将想法添加到传递给视图的数据数组中,使其更加冗长:

    public function showCommunities($id)
    {
        $community = Community::findOrFail($id);
    
        $ideas = $community->ideas
    
        return view('publicPages.ideas_in_community', compact('community', 'ideas));
    }
    

    希望这会有所帮助!

    更新

    我想您收到 App\idea not found 的原因是因为型号名称不匹配。将类名大写是一种很好的做法(在某些环境中必不可少),因此请确保以下几点:

    1. 您的班级名称是Idea,它的文件名为Idea.php
    2. 该类声明了它的命名空间,即namespace App;
    3. 如果您添加了一个新类但找不到它,您可能需要从命令行运行 composer dump-autoload 以更新自动加载器。

    【讨论】:

    • 感谢您给我宝贵的时间。你能告诉我如何在ideas_in_community 视图上显示communityideas 吗?我已经尝试过了,但它什么也没显示。我正在使用您上面列出的第三种功能。 @罗斯威尔逊
    • 到目前为止,您尝试了哪些方法来在该视图中展示这些想法?您可以在您的问题中添加您在view 中的内容的副本吗?
    猜你喜欢
    • 2017-04-19
    • 1970-01-01
    • 2018-03-16
    • 2018-01-15
    • 2016-06-21
    • 2018-03-11
    • 2016-07-15
    • 2018-04-30
    • 1970-01-01
    相关资源
    最近更新 更多