我正在尝试使用Laravel雄辩的关系创建社区关注系统,但我无法解决问题,请帮忙
基本上,我正在尝试创建一个基于社区(例如:商业与专业,健康与健康,科学与技术等)的活动系统。
它给我以下错误
Illuminate\Database\QueryException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'acp_db.community_users' doesn't exist (SQL: select * from `community_users` where `community_users`.`id` = 8 limit 1) in file /Users/muhammadowais/mowais/academics-provider/website/working/acpapi/vendor/laravel/framework/src/Illuminate/Database/Connection.php on line 664
要通过ID吸引社区的关注者,我创建了以下表格
1)用户
2)event_categories(可以说社区)
3)community_user (user_id, community_id)
控制器
public function communityBySlug($slug){
$eventCategory = EventCategories::where(['slug' => $slug])->first();
$eventCategoryId = $eventCategory->id;
// Getting users by community id
$users = CommunityUsers::find(8)->users();
return Response::json(
[
'data' => $eventCategory,
'community_followers' => $users
]
);
}
模型:社区用户
class CommunityUsers extends Model
{
protected $fillable = ['community_id', 'user_id'];
protected $guarded = [];
public function Users(){
return $this->belongsToMany(User::class, 'users');
}
}
答案 0 :(得分:1)
假设community_id
是您的CommunityUsers
表中的主键,那么问题出在您的Users()
函数中:
public function Users(){
return $this->belongsToMany(User::class, 'users');
}
belongsToMany
的第二个参数应该是外键,即user_id
答案 1 :(得分:1)
假定社区用户是将您的多对多关系表映射的模型,则应在数据库中为该模型指定正确的表名。
class CommunityUsers extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'community_users';
}
此外,请记住,Eloquent不支持复合主键,因此您必须将community_id
或user_id
设置为主键在CommunityUsers
模型中使用em>来在其上使用find()
方法,否则Laravel会在id
列中进行搜索。
我宁愿在关系表中插入一个新的主自动增量列,并使用where过滤检索一个特殊的社区,如下所示:
CommunityUsers::where('community_id', $id)->first();
注意:您还可以将该过滤器作为CommunityUsers
范围方法。
此外,请注意,您从Users
到CommunityUsers
的关系是一对多关系(一个User
映射到许多CommunityUsers
对([community_id,user_id]))
如果考虑这三个表,可以将其建模为Users
和Communities
之间的多对多关系。
关系应为:
型号:用户
class User extends Authenticatable
{
public function communities()
{
return $this->belongsToMany(EventCategories::class, 'community_user', 'user_id', 'community_id');
}
}
模型:事件类别(假设这是您的社区模型)
class EventCategories extends Model
{
public function users()
{
return $this->belongsToMany(User::class, 'community_user', 'community_id');
}
}
注意:上面的代码可能需要根据您的模型及其表定义进行一些调整。
在关系定义之后,您可以直接在EventCategories
模型上使用它:
public function communityBySlug($slug){
$eventCategory = EventCategories::with('users')
->whereSlug($slug)
->first();
return Response::json(
[
'data' => $eventCategory,
'community_followers' => $eventCategory->users
]
);
}