Laravel - как использовать отношение ownToMany с использованием второго индекса, а не первичного ключа - PullRequest
0 голосов
/ 23 мая 2018

Обзор приложения

Я изучаю 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

Что я хочу: Tag_id's 1, 2 и 3, которые будут назначены на выпуск 3, где issues.item_id - индекс, по которому нужно сопоставить.Например,

Correct result

Что я получаю: 1, 2 и 3 Tag_id назначены на выпуск 3, но извлекаются с использованием issues.id как индекс для сравнения.Например,

Incorrect result

Код

Проблемы миграции

    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?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Здесь я поместил код отношения модели для тегов проблем модели

<?php

namespace App\Models;
use Eloquent;

class IssueTag extends Eloquent{

    protected $table = 'issues_tags';

    public function issues()
    {
        return $this->belongsTo('App\Models\Issue', 'issue_id', 'item_id');
    }

    public function tags()
    {
        return $this->belongsTo('App\Models\Tag', 'tag_id');
    }

}
0 голосов
/ 23 мая 2018

Из исходного кода:

/**
     * Define a many-to-many relationship.
     *
     * @param  string  $related
     * @param  string  $table
     * @param  string  $foreignPivotKey
     * @param  string  $relatedPivotKey
     * @param  string  $parentKey
     * @param  string  $relatedKey
     * @param  string  $relation
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     */
    public function belongsToMany($related, $table = null, $foreignPivotKey = null, $relatedPivotKey = null,
                                  $parentKey = null, $relatedKey = null, $relation = null)

Вы можете переопределить любые параметры, Laravel просто помещает туда значения по умолчанию, сделанные из имен таблиц, если вы не указываете, какой из них использовать.

В вашемв этом случае это будет:

в Model / Issue.php

public function tags() {
  return $this->belongsToMany(Tag::class, 'tag_id', 'issue_id');
}

в Model / Tag.php

public function issues() {
  return $this->belongsToMany(Issue::class, 'issue_id', 'tag_id');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...