【问题标题】:Laravel - how to use belongsToMany relationship using second index and not primary keyLaravel - 如何使用第二个索引而不是主键来使用 belongsToMany 关系
【发布时间】:2018-05-23 12:24:06
【问题描述】:

应用概览

我正在学习 Laravel,我的虚拟应用程序允许用户针对项目记录问题。一个项目可以有很多问题,一个问题可以有很多标签。

我目前正在处理 projects/show.blade.php,它在 HTML 表中输出与项目相关的所有问题,其中包含 nametags 的列。

问题

我设置了“属于多个”关系,以便我的issuestagsissues_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-&gt;belongsToMany('App\Tag', 'issues_tags', 'issue_id', 'tag_id', 'item_id');

标签: php laravel laravel-5 eloquent foreign-keys


【解决方案1】:

来自源代码:

/**
     * 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');
}

【讨论】:

    【解决方案2】:

    这里我放了问题标签模型的模型关系代码

    <?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');
        }
    
    }
    

    【讨论】:

    • 这会产生与以前相同的结果。我不明白这将如何让关系看issues.item_id 而不是issues.id
    • 尝试使用 hasMany 而不是 belongsTo
    • 我的代码很完美你需要改变你的标签和问题模型 hasMany 而不是 belongsTo
    • 我刚刚更新了这一行 return $this->belongsTo('App\Models\Issue', 'issue_id', 'item_id');请立即查看
    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 2018-09-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 2013-09-03
    相关资源
    最近更新 更多