Php Laravel通过数据透视表查询数据
我有一个名为“projects”的表和一个名为“tags”的表。这两个节点通过名为“project_tag”的透视表连接,例如: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
// 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
语句,请参见编辑的答案它看起来有点不同,如果您感兴趣,我可以发布它的外观,您可以查看它吗?