Обзор приложения
Я изучаю Laravel, и мое фиктивное приложение позволяет пользователям регистрировать проблемы в проектах.У проекта может быть много проблем, и проблема может иметь много тегов.
В настоящее время я работаю над projects/show.blade.php
, который выводит все проблемы, связанные с проектом, в таблицу HTML со столбцами для name
и tags
.
Issue
Я установил «принадлежат многим» отношениям, чтобы мои issues
, tags
и issues_tags
(промежуточные) таблицы могли общаться с каждойдругое, но я столкнулся с проблемой, из-за которой теги выводятся против неправильных проблем.
Проблема связана с тем фактом, что моя таблица issues
(в соответствии с дизайном) содержит столбец item_id
, которыйиндекс, но не первичный ключ.Я использую item_id
для маршрутизации / отображения во внешнем интерфейсе, потому что я хотел, чтобы идентификатор проблемы, который пользователи видели, начинался с 1 для каждого нового проекта, а не был последовательным, и каждый знал, сколько их в базе данных.
Например, теги, назначенные для выпуска № 3, вызываются с использованием issues.id
, а не issues.item_id
.
Пример данных
![Sample data](https://i.stack.imgur.com/YKVUn.png)
Что я хочу: Tag_id's 1, 2 и 3, которые будут назначены на выпуск 3, где issues.item_id
- индекс, по которому нужно сопоставить.Например,
![Correct result](https://i.stack.imgur.com/X9cLq.png)
Что я получаю: 1, 2 и 3 Tag_id назначены на выпуск 3, но извлекаются с использованием issues.id
как индекс для сравнения.Например,
![Incorrect result](https://i.stack.imgur.com/ludlD.png)
Код
Проблемы миграции
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');
}
Просмотр (projects / 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>
Вопрос
Как я могу использовать issues.item_id
вместо issues.id
при использовании отношения ownToMany в Laravel?