2015-12-12 5 views
0

У меня, кажется, проблема с пониманием этого иерархического отношения.laravel eloquent relationship hierarchy

Farm> Поля> Чабаны> Овцы

Это кажется довольно простой иерархии - поля Farm hasMany, поле hasMany пастухов, пастух 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);, процесс распадается. Я был бы признателен за помощь в правильном способе сохранения, используя отношения между всеми таблицами.

Я тяну свои волосы, пытаясь понять это, поэтому любая помощь будет принята с благодарностью.

благодаря

+0

можете ли вы добавить некоторую информацию, такую ​​как ошибки, ожидаемый выход/реальный выход и т. д.? –

+0

Ошибка, которую я получаю, следующая: вызов неопределенного метода Illuminate \ Database \ Eloquent \ Collection :: shepherd(). Это происходит, когда я пытаюсь использовать $ farm-> field-> shepherd() -> save ($ shepherd). Но если я попробую $ field-> shepherd() -> save ($ shepherd), то это работает, почему я не могу делать $ farm-> field-> shepherd() -> save ($ shepherd)? – Basicmanthz

ответ

0

Вашего код ломает здесь:

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

ферма имеет много полеев, поэтому, когда вы ссылаетесь $ farm-> поле, вы получаете коллекцию поля объекта, не только Поле объект.

Чтобы заставить его работать, вам необходимо либо ссылки $ farm-> поле [0]

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

или просто использовать $ поле объект, который вы создали раньше:

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

Я бы также предложил использовать множественные имена для ваших hasMany отношений (поля, овцы и т. Д.) - таким образом вы всегда будете помнить, что ссылочные поля относятся к co ни один объект

+0

ОК, я думаю, что возвращаю свою логику назад. Я могу сказать $ sheep-> shepherd-> field-> farm, потому что каждая ссылка относится к одному элементу. Можно ли определить все мои объекты $ sheep, $ shepherd, $ field, $ farm и сохранить их с одной единственной функцией, чтобы все отношения были созданы? – Basicmanthz

+0

Да. Как только вы правильно установили отношения, вы можете вызвать push() вместо save() - он вызовет save() для текущей модели AND push() для всех отношений, которые, в свою очередь, вызову save() для всех связанных моделей и нажмите() на все их отношения и т. д. ... –

+0

Это потрясающе, спасибо за объяснение – Basicmanthz