laravel eloquent 关系层次
laravel eloquent relationship hierarchy
我似乎无法理解这种层次关系。
农场 > 田野 > 牧羊人 > 绵羊
这似乎是一个非常简单的层次结构 - 农场有许多田地,田地有许多牧羊人,牧羊人有许多羊。
羊属于牧羊人,牧羊人属于田地,田地属于农场。
我是这样定义模型关系的:
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);
,过程就会中断。如果能以正确的方式使用所有表之间的关系进行保存,我将不胜感激。
我正在努力理解这一点,所以我们将不胜感激。
谢谢
您的代码在这里中断:
$farm->field->shepherd()->save($shepherd);
农场有很多田地,所以当您引用 $farm->field 时,您将获得 Field 对象的集合,不仅仅是一个 Field 对象。
要使其正常工作,您需要参考 $farm->field[0]
$farm->field[0]->shepherd()->save($shepherd);
或者只使用您之前创建的 $field 对象:
$field->shepherd()->save($shepherd);
我还建议为您的 hasMany 关系(田地、绵羊等)使用复数名称 - 这样您将永远记住引用的字段指的是一个集合,而不是单个对象
我似乎无法理解这种层次关系。
农场 > 田野 > 牧羊人 > 绵羊
这似乎是一个非常简单的层次结构 - 农场有许多田地,田地有许多牧羊人,牧羊人有许多羊。
羊属于牧羊人,牧羊人属于田地,田地属于农场。
我是这样定义模型关系的:
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);
,过程就会中断。如果能以正确的方式使用所有表之间的关系进行保存,我将不胜感激。
我正在努力理解这一点,所以我们将不胜感激。
谢谢
您的代码在这里中断:
$farm->field->shepherd()->save($shepherd);
农场有很多田地,所以当您引用 $farm->field 时,您将获得 Field 对象的集合,不仅仅是一个 Field 对象。
要使其正常工作,您需要参考 $farm->field[0]
$farm->field[0]->shepherd()->save($shepherd);
或者只使用您之前创建的 $field 对象:
$field->shepherd()->save($shepherd);
我还建议为您的 hasMany 关系(田地、绵羊等)使用复数名称 - 这样您将永远记住引用的字段指的是一个集合,而不是单个对象