【发布时间】: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