2015-11-19 7 views
1

Я создал собственный метод push(), который сохраняет все отношения модели в каскадной манере и собирает полный снимок данных сущности и детей для журнала аудита.Связать отношения HasOne, не сохраняя его в Laravel 5

Все работает нормально с ownTo и hasMany отношениями. Я просто делаю следующее:

$ae->target()->associate(new AuditableEntryTarget(["name" => "single target"])); 

    $ae->children->add(new AuditableEntryChild(["name" => "one of children"])); 
    $ae->children->add(new AuditableEntryChild(["name" => "two of children"])); 

    // add grandchildren to the first child 
    $ae->children[0]->children->add(new AuditableEntrySubChild(["name" => "one of subchildren for first child"])); 

    // add target subchild 
    $ae->target->subtarget()->associate(new AuditableEntryTargetChild(["name" => "single target child"]));  

    // my custom method which saves and collects to audit log all the children, no matter if they are attached through hasMany or belongsTo 
    $ae->push(); 

Но проблема в отношении hasOne. Он не предлагает никакого способа привязать связанную модель к моей корневой модели, не сохраняя ее в первую очередь. HasOne отношение только сохранить() метод в Laravel:

/** 
* Attach a model instance to the parent model. 
* 
* @param \Illuminate\Database\Eloquent\Model $model 
* @return \Illuminate\Database\Eloquent\Model 
*/ 
public function save(Model $model) 
{ 
    $model->setAttribute($this->getPlainForeignKey(), $this->getParentKey()); 

    return $model->save() ? $model : false; 
} 

, которые, как вы видите, не только окружающих, но и сохраняет модель. Чтобы иметь возможность обнаруживать все изменения для полей, мой метод требует, чтобы отношения были привязаны к модели, но не были сохранены, потому что иначе я не смогу перехватить процесс сохранения и прикрепить данные к моему снимку. BelongsTo имеет associate и hasMany имеет add для крепления моделей без их сохранения, но я не могу найти ничего похожего на hasOne.

Есть ли способ, чтобы прикрепить новую модель экземпляра к hasOne связи, не вызывая его, чтобы спастись немедленно (что-то вроде associate для belongsTo или add для hasMany)?

ответ

1

С помощью Laracasts ребята, обходной путь, кажется,

$model->setRelation('child', $childInstance); 

Тем не менее, это странно, что Laravel не инициализирует отношения hasOne таким же образом, как это inits hasMany.

Смежные вопросы