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

Php Laravel通过数据透视表查询数据,php,mysql,laravel,Php,Mysql,Laravel,我有一个名为“projects”的表和一个名为“tags”的表。这两个节点通过名为“project_tag”的透视表连接,例如: // 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”的表和一个名为“tags”的表。这两个节点通过名为“project_tag”的透视表连接,例如:

// 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();
项目表中有1条记录的项目id为1

然后在“项目标签”表中有:

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是相当陌生的


非常感谢

假设您的模型名为Project,并且您的项目标记关系名为tags(),那么这应该适合您:

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

除了@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();

要按特定标记查询项目,可以执行以下操作:

// 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();
或者,您可以从透视表中查询项目,如下所示:

// 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();

它是否必须像这样格式化
%sometag%
?因为我有一个变量,标签存储在inNo中,所以我只是使用你的例子。您可以这样做
$query->where('name','like',“%{$varNameHere}%”。这个变量在哪里?你能粘贴代码吗?它是$varNameHere变量,我把它改成了我的变量,它说的是未定义的,但当我做dd($tag);它显示了变量,所以我不知道它说什么是undefinedYou必须告诉匿名函数使用它。问题是我不想使用标记\u id,我想使用存储在标记中的名称table@Cruzito在上面的第一个示例中,您可以将
id
更改为所需的任何列,例如
name
slug
它说未定义的变量tagMay bad,我忘了添加
use
语句,请参见编辑的答案它看起来有点不同,如果您感兴趣,我可以发布它的外观,您可以查看它吗?