在Laravel 4 Eloquent ORM中创建子关系时出错

时间:2014-10-17 10:20:41

标签: php laravel orm eloquent

我有一个包含2个模型的结构:

class Contenuti extends Eloquent {
    public function dettaglio()
    {
        return $this->hasOne('ContenutiDettaglio', 'contenuto_id');
    }
}

class ContenutiDettaglio extends Eloquent {
    public function contenuto()
    {
        return $this->belongsTo('Contenuti', 'contenuto_id', 'id');
    }
}    

我正在尝试扩展Contenuti的findOrNew,以便在创建Contenuti时始终添加ContenutiDettaglio项目。

我写了这样的扩展程序:

public static function findOrNew($id, $coloumns = array())
{
    $obj = parent::findOrNew($id);

    if(!isset($obj->dettaglio()->id))
    {
      $obj->save();

      $dettaglio = ContenutiDettaglio::create(array('titolo' => 'Nuovo contenuto'));
      $dettaglio->contenuto()->associate($obj);

      $obj = Contenuti::findOrFail($obj->id);

      dd($obj->dettaglio());
    }

    return $obj;
}

在数据库中,ContenutiDettaglio中的记录正确包含父ID,但是当我将$ obj-> dettaglio()转储为空时。我做错了吗?

修改:

以下是我的迁移:

#Contenuti
public function up()
{
    Schema::create('contenuti', function($t) {
            $t->engine = 'MyISAM';

            // vecchia tabella "contenuti"    
            $t->increments('id');
            $t->bigInteger('userid')->nullable();
            $t->boolean('pubblica');

            // vecchia tabella "contenuti_it"
            $t->timestamp('pubblica_dal')->nullable();
            $t->timestamp('pubblica_al')->nullable();

            $t->timestamps();

            $t->index('pubblica_dal');
            $t->index('pubblica_al');
            $t->index('created_at');
            $t->index('updated_at');
    });
}

#ContenutiDettaglio
public function up()
{
    Schema::create('contenuti_dettaglio', function(Blueprint $table)
    {
        $table->engine = 'MyISAM';

        $table->increments('id');
        $table->integer('contenuto_id');
        $table->string('keywords', 255);
        $table->string('titolo', 255);
        $table->text('sottotitolo');
        $table->text('occhiello');
        $table->text('riassunto');
        $table->text('descrizione');

        $table->index('contenuto_id');
        $table->index('titolo');
    });
}

contenuti_dettaglio中的contenuto_id是两个表之间的关键。

1 个答案:

答案 0 :(得分:1)

首先,这里是关于Eloquent关系的文档:http://laravel.com/docs/4.2/eloquent#relationships

因此,hasOne的基本语法是:

return $this->hasOne('ClassName', 'foreign_key', 'local_key');

默认情况下,foreign_keylocal_key等于' id'。 foreign_key是这种关系的主要关键。

对于belongsTo,它是:

return $this->belongsTo('ClassName', 'local_key', 'foreign_key');

默认情况下,local_keyforeign_key再次等同于' id'。 Contenuti模型中子项的关键字由foreign_key方法的hasOne定义。我不知道您确切的数据库架构,但我想您可以通过更改来解决此问题:

return $this->belongsTo('Contenuti', 'contenuto_id', 'id');

return $this->belongsTo('Contenuti', 'id', 'contenuto_id');

如果有效,请告诉我,如果没有,请附上这些表的迁移文件。