我有以下迁移:
表:bebidas:
class CreateBebidasTable extends Migration{
public function up() {
Schema::create('bebidas', function ($table) {
$table->increments('id');
$table->integer('tipo_id')->unsigned();
$table->string('bebi_name');
$table->string('bebi_size');
$table->float('bebi_price');
$table->timestamps();
$table->foreign('tipo_id')->references('id')->on('tipobebidas');
});
}
public function down() {
Schema::drop('bebidas');
}
}
表:tipobebidas
class CreateTiposBebidasTable extends Migration {
public function up()
{
Schema::create('tipobebidas', function($table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
}
public function down()
{
Schema::drop('tipobebidas');
}
}
这些是模型:
class Bebida extends Eloquent{
public function TipoBebida() {
return $this->belongsTo('TipoBebida');
}
}
class TipoBebida extends Eloquent{
protected $table = "tipobebidas";
public function Bebidas() {
return $this->hasMany('Bebida');
}
}
每个Bebida
(饮料)都有TipoBebida
(饮品类型),反之亦然。我正在尝试获取一个显示bebidas
表和tipobebidas
表中所有字段的组合表。
根据Laravel关于eager loading的文档,我正在运行以下命令:
$bebidas = Bebida::with('tipobebida')->get();
此时$bebidas
具有以下值:(我正在删除时间戳字段)
[
{"id":1,"bebi_name":"COCA-COLA","bebi_size":"1 litro",
"bebi_price":4,"tipo_id":1,"tipobebida":null},
{"id":2,"bebi_name":"COCA ZERO","bebi_size":"1 litro",
"bebi_price":4,"tipo_id":1,"tipobebida":null}
]
而不是"tipobebida":null
,我期待"name":"refrigerantes"
或tipobebidas
表内容的某种表示。
我检查了正在运行的SQL命令,这里是:
select * from `tipobebidas` where `tipobebidas`.`id` in (?)
我怎样才能让它发挥作用?
我将在几个嵌套foreach
循环中使用此数据,以显示按类型Bebida
分组的饮品TipoBebida
。
谢谢!
答案 0 :(得分:2)
我得到了它的工作。 这一切都归结为命名惯例。
这就是我的所作所为:
- foreign id field
的名称必须是singular
名称加table
的{{1}},因此_id
的迁移已更改为以下:
bebidas
此外,外键关系产生SQL错误,尝试修复它,仍然没有,所以我删除了以下行: class CreateBebidasTable extends Migration{
public function up() {
Schema::create('bebidas', function ($table) {
$table->increments('id');
$table->integer('tipobebida_id')->unsigned(); // ** new field name **
$table->string('name');
$table->string('size');
$table->float('price');
$table->timestamps();
});
}
public function down() {
Schema::drop('bebidas');
}
}
其他一切都没有改变。
急切加载正在发挥作用。
感谢大家的帮助!!!
答案 1 :(得分:0)
首先,在表bebidas和tipobebidas我看不到和外键... 我想在bebidas你应该有tipobebidas_id,它是tipobebidas id字段的外键。 执行此操作后,将模型方法更改为:
class Bebida extends Eloquent{
protected $table = "bebidas";
public function TipoBebida() {
return $this->belongsTo('TipoBebida', 'tipobebida_id');
}
}
class TipoBebida extends Eloquent{
protected $table = "tipobebidas";
public function Bebidas() {
return $this->hasMany('Bebida');
}