一对多关系返回NULL

时间:2013-09-20 13:38:26

标签: laravel laravel-4 eloquent

我有以下迁移:

表: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

谢谢!

2 个答案:

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