【问题标题】:Laravel 5.2 Eloquent Relationships with Irregular NamesLaravel 5.2 具有不规则名称的雄辩关系
【发布时间】:2016-04-11 09:24:54
【问题描述】:

我正在 Laravel 中构建我的第一个项目,但在两个表之间存在一对多关系时遇到了一些问题。

从历史上看,我会在 SQL 中做这样的事情来实现我的最终目标:

SELECT tag_key.key
FROM tag
LEFT JOIN tag_key
ON tag.tag_key_id = tag_key.id;

对于 Laravel,我正在尝试以 ORM 方式做事,但我被挂断了,可能是在管道某处的命名事情上。代码如下:

第 1 部分:迁移:

“tag_keys”表

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTagKeysTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tag_keys', function (Blueprint $table) {
            $table->increments('id');
            $table->string('key', 128);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('tag_keys');
    }
}

“标签”表

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTagsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->increments('id');
            $table->string('value', 128);

            $table->integer('tag_key_id')->unsigned()->index();
            $table->foreign('tag_key_id')->references('id')->on('tag_keys')->onDelete('cascade');

            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('tags');
    }
}

第 2 部分:模型:

“TagKey”模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class TagKey extends Model
{
    protected $fillable = [
        'key'
    ];

    protected $dates = [];

    protected $table = 'tag_keys';

    /**
     * Tag Keys have many Tags
     */
    public function values()
    {
        return $this->hasMany('App\Tag');
    }
}

“标签”模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
    protected $fillable = [
        'value',
        'tag_key_id'
    ];

    protected $dates = [];

    /**
     * Tag values belong to Tag Keys
     */
    public function key()
    {
        return $this->belongsTo('App\TagKey');
    }
}

独立地,它们都工作得很好。但是,当我跳入修补程序并尝试此操作时(假设“tag”和“tag_key”表中都有一个有效行,并且“tag”中的 id 1 在“tag_key”表中的值为 1 “tag_key_id”列):

$tag = App\Tag::first();
$tag->key;

=> null

我在这里缺少什么?我如何建立这个关联?

【问题讨论】:

  • 你检查过 laravel 文档吗?有一些关于如何定义多对多关系的示例,这不是你这样做的方式 - laravel.com/docs/5.2/eloquent-relationships#many-to-many
  • @jedrzej.kurylo,感谢您的指点。这实际上是一对多的关系,所以多对多文档在这里并不适用。愿意成为我的第二双眼睛并帮助我调试问题吗?从根本上说,我认为这与混合骆驼箱和蛇箱有关。下一步是更改数据库命名。

标签: sql orm eloquent laravel-5.2


【解决方案1】:

当外键名称不遵循 Eloquent 约定(拥有模型的“蛇形”名称并以 _id 为后缀)时,您应该在关系中指定它:

TagKey 对象:

return $this-&gt;hasMany('App\Tag', 'tag_key_id');

关键对象:

return $this-&gt;belongsTo('App\TagKey', 'tag_key_id');

更多信息in the documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2016-12-27
    • 2015-03-14
    相关资源
    最近更新 更多