所以,马上进入问题。有人告诉我,如果我们只想要pivot table
表,我们就不需要制作ids
。 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”类
答案 0 :(得分:0)
您定义多对多关系的方式看起来不错 - 我只是将它们称为社区()和 ideas(),因为它们会返回一组对象,而不是一个对象。
确保使用正确的类名 - 我可以看到您使用不同的案例引用模型类 - 请参阅 App \ Community 和 App \ idea 。
为了找到相关模型,Eloquent将在数据透视表中查找匹配的行 - 在您的情况下,它应命名为 community_idea 并有3个字段: community_id , idea_id 并自动增加主键 ID 。
有了这些,你应该能够通过以下方式获得与给定社区相关的所有想法:
$ideas = Community::findOrFail($communityId)->ideas;
如果您需要与给定想法相关联的社区,请执行以下操作:
$communities = Idea::findOrFail($ideaId)->communities;
您可以在此处详细了解如何使用多对多关系:https://laravel.com/docs/5.1/eloquent-relationships#many-to-many
答案 1 :(得分:0)
有人告诉我,如果我们只想要表格的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
未找到的原因是因为模型名称不匹配。将类名称大写是一种很好的做法(在某些环境中必不可少),因此请确保以下内容:
Idea
,其档案名为Idea.php
namespace App;
composer dump-autoload
以更新自动加载器。