如何从集合中获取belongsToMany()查询? MySQL的/ Laravel

时间:2017-05-16 14:15:07

标签: php mysql laravel

我正在使用Laravel 5.4.22(最新版本)。在MySQL中,我有2个表,tag_categories和标签,它们形成了多对多的关系。我需要的是一个返回所选类别的所有标签的查询。当我只有一个对象时,我知道如何解决这个问题,而且我知道如何通过查询和循环每个对象来解决这个问题,但是对于整个事情,必须有基于查询或雄辩的解决方案吗?

我理解下面的代码不起作用,因为我在集合而不是对象上使用 - > belongsToMany,但是如何以最简单的方式弥合这个差距?

        $resultingTags = TagCategory::whereIn('id', $chosenCategoriesIds)->belongsToMany(Tag::Class)->get();

    dd($resultingTags);

提前谢谢

2 个答案:

答案 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个表tagstag_categoriestag_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();