【发布时间】:2018-05-23 12:24:06
【问题描述】:
应用概览
我正在学习 Laravel,我的虚拟应用程序允许用户针对项目记录问题。一个项目可以有很多问题,一个问题可以有很多标签。
我目前正在处理 projects/show.blade.php,它在 HTML 表中输出与项目相关的所有问题,其中包含 name 和 tags 的列。
问题
我设置了“属于多个”关系,以便我的issues、tags 和issues_tags(中间)表可以相互通信,但我遇到了一个问题,即输出标签错误的问题。
问题源于我的issues 表(按设计)包含一个item_id 列,这是一个索引但不是主键。我使用item_id 在前端进行路由/显示,因为我希望用户看到的问题 ID 对于添加的每个新项目从 1 开始,而不是按顺序排列,并且每个人都知道数据库中有多少。
例如,分配给问题 #3 的标签使用issues.id 而不是issues.item_id 调用。
样本数据
我想要什么: 将 Tag_id 的 1、2 和 3 分配给问题 3,其中 issues.item_id 是要匹配的索引。例如
我得到了什么: Tag_id 的 1、2 和 3 分配给问题 3,但使用 issues.id 作为要匹配的索引来检索。例如
代码
问题迁移
Schema::create('issues', function (Blueprint $table) {
$table->increments('id');
$table->integer('item_id')->index()->unsigned();
$table->integer('project_id')->unsigned();
$table->string('name');
$table->longText('description');
$table->tinyInteger('status')->default('1');
$table->integer('created_by');
$table->timestamps();
});
标签迁移
Schema::create('tags', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
问题标签迁移
Schema::create('issues_tags', function (Blueprint $table) {
$table->increments('id');
$table->integer('tag_id')->unsigned()->index();
$table->foreign('tag_id')->references('id')->on('tags');
$table->integer('issue_id')->unsigned()->index();
$table->foreign('issue_id')->references('item_id')->on('issues');
$table->timestamps();
});
问题模型
public function tags()
{
return $this->belongsToMany('App\Tag', 'issues_tags');
}
标签模型
public function issues()
{
return $this->belongsToMany('App\Issue', 'issues_tags', 'issue_id')->withPivot('item_id');
}
查看(项目/show.blade.php)
<table>
<tr>
<th>ID</th>
<th>Item ID</th>
<th>Issue</th>
<th>Tags</th>
</tr>
@foreach($issues as $issue)
<tr>
<td>{{ $issue->id }}</td>
<td>{{ $issue->item_id }}</td>
<td>{{ $issue->name }}</td>
<td>
@foreach($issue->tags as $tag)
<span class="badge badge-primary">{{ $tag->name }}</span>
@endforeach
</td>
</tr>
@endforeach
</table>
问题
在 Laravel 中使用 belongsToMany 关系时,如何使用 issues.item_id 而不是 issues.id?
【问题讨论】:
-
您是否创建了模型关系?请在此处填写您的关系代码
-
知道我忘记了什么。我已经添加了模型。问题标签模型是一个空类 - 我没有添加任何东西。
-
我更新了问题中的示例以帮助更好地解释问题。
-
@Nutic 在正确的路线上。我最终在我的问题模型中使用了它:
return $this->belongsToMany('App\Tag', 'issues_tags', 'issue_id', 'tag_id', 'item_id');
标签: php laravel laravel-5 eloquent foreign-keys