laravel雄辩的关系等级

时间:2015-12-12 00:31:19

标签: php laravel laravel-5 eloquent 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);,这个过程就会崩溃。我将非常感谢您使用所有表之间的关系以正确的方式保存。

我想把头发拉出来试图理解这一点,所以任何帮助都会非常感激。

感谢

1 个答案:

答案 0 :(得分:0)

你的代码在这里打破:

$farm->field->shepherd()->save($shepherd);

农场有很多字段,所以当你引用 $ farm->字段时,你会得到一个 Field 对象的集合,而不只是一个字段对象。

要使其有效,您需要引用 $ farm->字段[0]

$farm->field[0]->shepherd()->save($shepherd);

或者只使用之前创建的 $ field 对象:

$field->shepherd()->save($shepherd);

我还建议您为 hasMany 关系(字段,绵羊等)使用复数名称 - 这样您就会始终记住引用的字段是指集合,而不是单个对象