183 lines
4.4 KiB
PHP
183 lines
4.4 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace Illuminate\Database\Eloquent\Relations;
|
||
|
|
||
|
class MorphPivot extends Pivot
|
||
|
{
|
||
|
/**
|
||
|
* The type of the polymorphic relation.
|
||
|
*
|
||
|
* Explicitly define this so it's not included in saved attributes.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $morphType;
|
||
|
|
||
|
/**
|
||
|
* The value of the polymorphic relation.
|
||
|
*
|
||
|
* Explicitly define this so it's not included in saved attributes.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $morphClass;
|
||
|
|
||
|
/**
|
||
|
* Set the keys for a save update query.
|
||
|
*
|
||
|
* @param \Illuminate\Database\Eloquent\Builder $query
|
||
|
* @return \Illuminate\Database\Eloquent\Builder
|
||
|
*/
|
||
|
protected function setKeysForSaveQuery($query)
|
||
|
{
|
||
|
$query->where($this->morphType, $this->morphClass);
|
||
|
|
||
|
return parent::setKeysForSaveQuery($query);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the keys for a select query.
|
||
|
*
|
||
|
* @param \Illuminate\Database\Eloquent\Builder $query
|
||
|
* @return \Illuminate\Database\Eloquent\Builder
|
||
|
*/
|
||
|
protected function setKeysForSelectQuery($query)
|
||
|
{
|
||
|
$query->where($this->morphType, $this->morphClass);
|
||
|
|
||
|
return parent::setKeysForSelectQuery($query);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Delete the pivot model record from the database.
|
||
|
*
|
||
|
* @return int
|
||
|
*/
|
||
|
public function delete()
|
||
|
{
|
||
|
if (isset($this->attributes[$this->getKeyName()])) {
|
||
|
return (int) parent::delete();
|
||
|
}
|
||
|
|
||
|
if ($this->fireModelEvent('deleting') === false) {
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
$query = $this->getDeleteQuery();
|
||
|
|
||
|
$query->where($this->morphType, $this->morphClass);
|
||
|
|
||
|
return tap($query->delete(), function () {
|
||
|
$this->fireModelEvent('deleted', false);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the morph type for the pivot.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getMorphType()
|
||
|
{
|
||
|
return $this->morphType;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the morph type for the pivot.
|
||
|
*
|
||
|
* @param string $morphType
|
||
|
* @return $this
|
||
|
*/
|
||
|
public function setMorphType($morphType)
|
||
|
{
|
||
|
$this->morphType = $morphType;
|
||
|
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the morph class for the pivot.
|
||
|
*
|
||
|
* @param string $morphClass
|
||
|
* @return \Illuminate\Database\Eloquent\Relations\MorphPivot
|
||
|
*/
|
||
|
public function setMorphClass($morphClass)
|
||
|
{
|
||
|
$this->morphClass = $morphClass;
|
||
|
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the queueable identity for the entity.
|
||
|
*
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function getQueueableId()
|
||
|
{
|
||
|
if (isset($this->attributes[$this->getKeyName()])) {
|
||
|
return $this->getKey();
|
||
|
}
|
||
|
|
||
|
return sprintf(
|
||
|
'%s:%s:%s:%s:%s:%s',
|
||
|
$this->foreignKey, $this->getAttribute($this->foreignKey),
|
||
|
$this->relatedKey, $this->getAttribute($this->relatedKey),
|
||
|
$this->morphType, $this->morphClass
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get a new query to restore one or more models by their queueable IDs.
|
||
|
*
|
||
|
* @param array|int $ids
|
||
|
* @return \Illuminate\Database\Eloquent\Builder
|
||
|
*/
|
||
|
public function newQueryForRestoration($ids)
|
||
|
{
|
||
|
if (is_array($ids)) {
|
||
|
return $this->newQueryForCollectionRestoration($ids);
|
||
|
}
|
||
|
|
||
|
if (! str_contains($ids, ':')) {
|
||
|
return parent::newQueryForRestoration($ids);
|
||
|
}
|
||
|
|
||
|
$segments = explode(':', $ids);
|
||
|
|
||
|
return $this->newQueryWithoutScopes()
|
||
|
->where($segments[0], $segments[1])
|
||
|
->where($segments[2], $segments[3])
|
||
|
->where($segments[4], $segments[5]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get a new query to restore multiple models by their queueable IDs.
|
||
|
*
|
||
|
* @param array $ids
|
||
|
* @return \Illuminate\Database\Eloquent\Builder
|
||
|
*/
|
||
|
protected function newQueryForCollectionRestoration(array $ids)
|
||
|
{
|
||
|
$ids = array_values($ids);
|
||
|
|
||
|
if (! str_contains($ids[0], ':')) {
|
||
|
return parent::newQueryForRestoration($ids);
|
||
|
}
|
||
|
|
||
|
$query = $this->newQueryWithoutScopes();
|
||
|
|
||
|
foreach ($ids as $id) {
|
||
|
$segments = explode(':', $id);
|
||
|
|
||
|
$query->orWhere(function ($query) use ($segments) {
|
||
|
return $query->where($segments[0], $segments[1])
|
||
|
->where($segments[2], $segments[3])
|
||
|
->where($segments[4], $segments[5]);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
return $query;
|
||
|
}
|
||
|
}
|