<?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;

trait PushNew
{
	public function pushNew() {
		if (! $this->save()) {
			// We dont traverse this models relations
			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;

			$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()]);

					return false;
				}
			}
		}

		return true;
	}
}