我有一张名为' 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来说相当新鲜
非常感谢提前!
答案 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();