我似乎在理解这种等级关系时遇到了问题。
农场>字段>牧羊人>羊
这似乎是一个非常简单的等级 - 农场有很多领域,野外有很多牧羊人,牧羊人有很多羊。
绵羊属于牧羊人,牧羊人属于田地,田地属于农场。我已经定义了这种模型关系:
class Sheep extends Model {
protected $fillable ['name'];
public function shepherd() {
return $this->belongsTo('App\Shepherd');
}
}
class Shepherd extends Model {
protected $fillable ['name'];
public function field() {
return $this->belongsTo('App\Field');
}
public function sheep() {
return $this->hasMany('App\Sheep');
}
}
class Field extends Model {
protected $fillable ['name'];
public function farm() {
return $this->belongsTo('App\Farm');
}
public function shepherd() {
return $this->hasMany('App\Shepperd');
}
}
class Farm extends Model {
protected $fillable ['name'];
public function field() {
return $this->hasMany('App\Field');
}
}
public function up()
{
Schema::create('farms', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
});
}
public function up()
{
Schema::create('fields', function (Blueprint $table) {
$table->increments('id');
$table->integer('farm_id');
$table->string('name');
});
}
public function up()
Schema::create('shepherds', function (Blueprint $table) {
$table->increments('id');
$table->integer('field_id');
$table->string('name');
});
}
public function up()
Schema::create('sheep', function (Blueprint $table) {
$table->increments('id');
$table->integer('shepherd_id');
$table->string('name');
});
}
我希望能够以下列方式保存每个模型。
$farm = new App\Farm;
$farm->name = 'West Farm';
$field = new App\Field;
$field->name = 'The orchard';
$shepherd = new App\Shepherd;
$shepherd->name = 'Jason';
$sheep = new App\Sheep;
$sheep->name = 'Sean';
$farm->save();
$farm->field()->save($farm);
$farm->field->shepherd()->save($shepherd);
$farm->field->shepherd->sheep()->save($sheep);
但它不起作用。一旦我到达$farm->field->shepherd()->save($shepherd);
,这个过程就会崩溃。我将非常感谢您使用所有表之间的关系以正确的方式保存。
我想把头发拉出来试图理解这一点,所以任何帮助都会非常感激。
感谢
答案 0 :(得分:0)
你的代码在这里打破:
$farm->field->shepherd()->save($shepherd);
农场有很多字段,所以当你引用 $ farm->字段时,你会得到一个 Field 对象的集合,而不只是一个字段对象。
要使其有效,您需要引用 $ farm->字段[0]
$farm->field[0]->shepherd()->save($shepherd);
或者只使用之前创建的 $ field 对象:
$field->shepherd()->save($shepherd);
我还建议您为 hasMany 关系(字段,绵羊等)使用复数名称 - 这样您就会始终记住引用的字段是指集合,而不是单个对象