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 关系(田地、绵羊等)使用复数名称 - 这样您将永远记住引用的字段指的是一个集合,而不是单个对象