Связывание отношений HasOne без сохранения в Laravel 5

Я создал собственный метод push (), который сохраняет все отношения модели каскадным способом и собирает полный снимок сущности и дочерних элементов для журнала аудита.

Все отлично работает с принадлежит и имеет много отношений. Я просто делаю следующее:

    $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 имеет только метод save () в 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)?

2

Решение

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

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]