osb/app/Traits/PushNew.php

45 lines
1.2 KiB
PHP
Raw Permalink Normal View History

2020-04-01 12:35:06 +00:00
<?php
/**
* Enables a pushnew() method, similar to push() but when all relationships are new records
*
* Base on Model::push()
*/
namespace App\Traits;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\Log;
2020-04-01 12:35:06 +00:00
trait PushNew
{
public function pushNew() {
if (! $this->save()) {
// We dont traverse this models relations
2020-04-01 12:35:06 +00:00
return false;
}
// To sync all of the relationships to the database, we will simply spin through
// the relationships and save each model via this "pushNew" method, which allows
// us to recurse into all of these nested relations for the model instance.
foreach ($this->relations as $key => $models) {
// If we are not pushable, jump to the next item.
if ((! is_array($this->pushable)) || (! in_array($key,$this->pushable)))
continue;
2020-04-01 12:35:06 +00:00
$models = $models instanceof Collection
? $models->all() : [$models];
foreach (array_filter($models) as $model) {
$model->setAttribute($this->getForeignKey(),$this->{$this->getKeyName()});
if (! $model->pushNew()) {
Log::alert('Failed to save model',['attrs'=>$model->getAttributes()]);
2020-04-01 12:35:06 +00:00
return false;
}
}
}
return true;
}
}