142 lines
3.5 KiB
PHP
142 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace Illuminate\Database\Eloquent\Relations;
|
|
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
|
|
abstract class MorphOneOrMany extends HasOneOrMany
|
|
{
|
|
/**
|
|
* The foreign key type for the relationship.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $morphType;
|
|
|
|
/**
|
|
* The class name of the parent model.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $morphClass;
|
|
|
|
/**
|
|
* Create a new morph one or many relationship instance.
|
|
*
|
|
* @param \Illuminate\Database\Eloquent\Builder $query
|
|
* @param \Illuminate\Database\Eloquent\Model $parent
|
|
* @param string $type
|
|
* @param string $id
|
|
* @param string $localKey
|
|
* @return void
|
|
*/
|
|
public function __construct(Builder $query, Model $parent, $type, $id, $localKey)
|
|
{
|
|
$this->morphType = $type;
|
|
|
|
$this->morphClass = $parent->getMorphClass();
|
|
|
|
parent::__construct($query, $parent, $id, $localKey);
|
|
}
|
|
|
|
/**
|
|
* Set the base constraints on the relation query.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function addConstraints()
|
|
{
|
|
if (static::$constraints) {
|
|
$this->getRelationQuery()->where($this->morphType, $this->morphClass);
|
|
|
|
parent::addConstraints();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set the constraints for an eager load of the relation.
|
|
*
|
|
* @param array $models
|
|
* @return void
|
|
*/
|
|
public function addEagerConstraints(array $models)
|
|
{
|
|
parent::addEagerConstraints($models);
|
|
|
|
$this->getRelationQuery()->where($this->morphType, $this->morphClass);
|
|
}
|
|
|
|
/**
|
|
* Create a new instance of the related model. Allow mass-assignment.
|
|
*
|
|
* @param array $attributes
|
|
* @return \Illuminate\Database\Eloquent\Model
|
|
*/
|
|
public function forceCreate(array $attributes = [])
|
|
{
|
|
$attributes[$this->getForeignKeyName()] = $this->getParentKey();
|
|
$attributes[$this->getMorphType()] = $this->morphClass;
|
|
|
|
return $this->related->forceCreate($attributes);
|
|
}
|
|
|
|
/**
|
|
* Set the foreign ID and type for creating a related model.
|
|
*
|
|
* @param \Illuminate\Database\Eloquent\Model $model
|
|
* @return void
|
|
*/
|
|
protected function setForeignAttributesForCreate(Model $model)
|
|
{
|
|
$model->{$this->getForeignKeyName()} = $this->getParentKey();
|
|
|
|
$model->{$this->getMorphType()} = $this->morphClass;
|
|
}
|
|
|
|
/**
|
|
* Get the relationship query.
|
|
*
|
|
* @param \Illuminate\Database\Eloquent\Builder $query
|
|
* @param \Illuminate\Database\Eloquent\Builder $parentQuery
|
|
* @param array|mixed $columns
|
|
* @return \Illuminate\Database\Eloquent\Builder
|
|
*/
|
|
public function getRelationExistenceQuery(Builder $query, Builder $parentQuery, $columns = ['*'])
|
|
{
|
|
return parent::getRelationExistenceQuery($query, $parentQuery, $columns)->where(
|
|
$query->qualifyColumn($this->getMorphType()), $this->morphClass
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get the foreign key "type" name.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getQualifiedMorphType()
|
|
{
|
|
return $this->morphType;
|
|
}
|
|
|
|
/**
|
|
* Get the plain morph type name without the table.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getMorphType()
|
|
{
|
|
return last(explode('.', $this->morphType));
|
|
}
|
|
|
|
/**
|
|
* Get the class name of the parent model.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getMorphClass()
|
|
{
|
|
return $this->morphClass;
|
|
}
|
|
}
|