我正在使用Laravel 5.4.22(最新版本)。在MySQL中,我有2个表,tag_categories和标签,它们形成了多对多的关系。我需要的是一个返回所选类别的所有标签的查询。当我只有一个对象时,我知道如何解决这个问题,而且我知道如何通过查询和循环每个对象来解决这个问题,但是对于整个事情,必须有基于查询或雄辩的解决方案吗?
我理解下面的代码不起作用,因为我在集合而不是对象上使用 - > belongsToMany,但是如何以最简单的方式弥合这个差距?
$resultingTags = TagCategory::whereIn('id', $chosenCategoriesIds)->belongsToMany(Tag::Class)->get();
dd($resultingTags);
提前谢谢
答案 0 :(得分:4)
belongsToMany通常属于模型类,而不是动态调用的方法。当您希望加载关系时,您可以在查询构建器上调用with()
方法。
https://laravel.com/docs/5.4/eloquent-relationships#many-to-many
例如:
class User extends Model
{
/**
* The roles that belong to the user.
*/
public function roles()
{
return $this->belongsToMany('App\Role');
}
}
// Query
$users = User::with('roles')->get();
$rolesOfFirstUser = $users->first()->roles;
如果您尝试获取给定类别的所有标记,那么您应该查询标记,而不是tag_categories。
Tag::whereHas('categories', function ($query) use ($chosenCategoriesIds) {
$query->whereIn('id', $chosenCategoriesIds);
})->get();
答案 1 :(得分:1)
这是One-to-many关系
在TagCategory
app/TagCategory.php
模型的关系
public function tags()
{
return $this->hasMany('App\Tag');
}
并处理Controller
$resultingTags = TagCategory::whereIn('id', $chosenCategoriesIds)->with(['tags'])->get();
如果您想为此案例定义Many-To-Many关系
您需要有3个表tags
,tag_categories
,tag_tag_category
在TagCategory
app/TagCategory.php
模型的关系
public function tags()
{
return $this->belongsToMany('App\Tag', 'tag_tag_category', 'tagcategory_id', 'tag_id');
}
并处理Controller
$resultingTags = TagCategory::whereIn('id', $chosenCategoriesIds)->with(['tags'])->get();