Laravel通过数据透视表查询数据

时间:2016-05-30 12:41:05

标签: php mysql laravel

我有一张名为' projects'还有一个名为' tags'的表格。这两个通过名为' project_tag'的数据透视表连接。所以例如:

项目表中有1条记录,其中包含project_id 1

然后在' project_tag'表有这个:

project_id 1 and tag_id 1

和tag_id 1是" sometag"例如

现在我的问题是我想查询所有有" sometag"作为标签表中的名称。 有没有办法做到这一点?或者我应该使用id而不是标记值?

我的模型是什么样的:

项目模型:

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

标记模型:

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

我的数据库结构有点迷失:)我对laravel来说相当新鲜

非常感谢提前!

3 个答案:

答案 0 :(得分:2)

假设您的模型名为项目,而您的项目标记关系称为标记(),这应该适合您:

    Project::whereHas('tags', function ($query) {
        $query->where('name', 'like', '%sometag%');
    })->get();

答案 1 :(得分:0)

添加@TheFallen表示你的模型应该是这样的

class Tag extends Model
{
    /**
     * Get all of the tags project
     */
    public function projects()
    {
        return $this->belongsToMany('App\Project');
    }
}

class Project extends Model
{
    /**
     * Get all of the project's tag
     */
    public function tags()
    {
        return $this->belongsToMany('App\Tag');
    }
}

然后你可以这样做

   Project::whereHas('tags', function ($query) {
        $query->where('name', 'like', '%sometag%');
    })->get();

答案 2 :(得分:0)

要按某些标记查询项目,您可以这样做:

// Get projects by a single tag
$tag = 'mytag';

Project::whereHas('tags', function ($q) use ($tag) {
    $q->whereName($tag);
    // or $q->whereSlug($tag);
})->get();

// Get projects by multiple tags
$tags = ['mytag', 'othertag', 'iamtag'];

Project::whereHas('tags', function ($q) use ($tags) {
    $q->whereIn('name', $tags);
})->get();

或者您可以从数据透视表中查询项目,如下所示:

// Get projects by a single tag
$tag_id = 1;

Project::whereIn('id', function($q) use ($tag_id) {
    $q->select('project_id')->from('project_tag')->where('tag_id', $tag_id);
})->get();

// Get projects by multiple tags
$tag_ids = [1, 2, 3];

Project::whereIn('id', function($q) use ($tag_ids) {
    $q->select('project_id')->from('project_tag')->whereIn('tag_id', $tag_ids);
})->get();