-
-
Notifications
You must be signed in to change notification settings - Fork 63
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Support existence queries on PostgreSQL
- Loading branch information
1 parent
f26da67
commit 2d9dd76
Showing
20 changed files
with
474 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
<?php | ||
|
||
namespace Staudenmeir\EloquentJsonRelations\Relations\Postgres; | ||
|
||
use Illuminate\Database\Eloquent\Builder; | ||
use Illuminate\Database\Eloquent\Relations\BelongsTo as Base; | ||
|
||
class BelongsTo extends Base | ||
{ | ||
use IsPostgresRelation; | ||
|
||
/** | ||
* Add the constraints for a 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 = ['*']) | ||
{ | ||
if ($parentQuery->getQuery()->from == $query->getQuery()->from) { | ||
return $this->getRelationExistenceQueryForSelfRelation($query, $parentQuery, $columns); | ||
} | ||
|
||
$first = $this->jsonColumn($query, $this->related, $this->getQualifiedForeignKey(), $this->ownerKey); | ||
|
||
return $query->select($columns)->whereColumn( | ||
$first, '=', $query->qualifyColumn($this->ownerKey) | ||
); | ||
} | ||
|
||
/** | ||
* Add the constraints for a relationship query on the same table. | ||
* | ||
* @param \Illuminate\Database\Eloquent\Builder $query | ||
* @param \Illuminate\Database\Eloquent\Builder $parentQuery | ||
* @param array|mixed $columns | ||
* @return \Illuminate\Database\Eloquent\Builder | ||
*/ | ||
public function getRelationExistenceQueryForSelfRelation(Builder $query, Builder $parentQuery, $columns = ['*']) | ||
{ | ||
$query->select($columns)->from( | ||
$query->getModel()->getTable().' as '.$hash = $this->getRelationCountHash() | ||
); | ||
|
||
$query->getModel()->setTable($hash); | ||
|
||
$first = $this->jsonColumn($query, $this->related, $this->getQualifiedForeignKey(), $this->ownerKey); | ||
|
||
return $query->whereColumn( | ||
$first, $hash.'.'.$this->ownerKey | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<?php | ||
|
||
namespace Staudenmeir\EloquentJsonRelations\Relations\Postgres; | ||
|
||
use Illuminate\Database\Eloquent\Relations\HasMany as Base; | ||
|
||
class HasMany extends Base | ||
{ | ||
use HasOneOrMany; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<?php | ||
|
||
namespace Staudenmeir\EloquentJsonRelations\Relations\Postgres; | ||
|
||
use Illuminate\Database\Eloquent\Relations\HasOne as Base; | ||
|
||
class HasOne extends Base | ||
{ | ||
use HasOneOrMany; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
<?php | ||
|
||
namespace Staudenmeir\EloquentJsonRelations\Relations\Postgres; | ||
|
||
use Illuminate\Database\Eloquent\Builder; | ||
use Illuminate\Database\Eloquent\Model; | ||
|
||
trait HasOneOrMany | ||
{ | ||
use IsPostgresRelation; | ||
|
||
/** | ||
* Add the constraints for a 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 = ['*']) | ||
{ | ||
if ($query->getQuery()->from == $parentQuery->getQuery()->from) { | ||
return $this->getRelationExistenceQueryForSelfRelation($query, $parentQuery, $columns); | ||
} | ||
|
||
$second = $this->jsonColumn($query, $this->parent, $this->getExistenceCompareKey(), $this->localKey); | ||
|
||
return $query->select($columns)->whereColumn( | ||
$this->getQualifiedParentKeyName(), '=', $second | ||
); | ||
} | ||
|
||
/** | ||
* Add the constraints for a relationship query on the same table. | ||
* | ||
* @param \Illuminate\Database\Eloquent\Builder $query | ||
* @param \Illuminate\Database\Eloquent\Builder $parentQuery | ||
* @param array|mixed $columns | ||
* @return \Illuminate\Database\Eloquent\Builder | ||
*/ | ||
public function getRelationExistenceQueryForSelfRelation(Builder $query, Builder $parentQuery, $columns = ['*']) | ||
{ | ||
$query->from($query->getModel()->getTable().' as '.$hash = $this->getRelationCountHash()); | ||
|
||
$query->getModel()->setTable($hash); | ||
|
||
$second = $this->jsonColumn($query, $this->parent, $hash.'.'.$this->getForeignKeyName(), $this->localKey); | ||
|
||
return $query->select($columns)->whereColumn( | ||
$this->getQualifiedParentKeyName(), '=', $second | ||
); | ||
} | ||
|
||
/** | ||
* Get the name of the "where in" method for eager loading. | ||
* | ||
* @param \Illuminate\Database\Eloquent\Model $model | ||
* @param string $key | ||
* @return string | ||
*/ | ||
protected function whereInMethod(Model $model, $key) | ||
{ | ||
return 'whereIn'; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
<?php | ||
|
||
namespace Staudenmeir\EloquentJsonRelations\Relations\Postgres; | ||
|
||
use Illuminate\Database\Eloquent\Builder; | ||
use Illuminate\Database\Eloquent\Model; | ||
use Illuminate\Database\Query\Expression; | ||
|
||
trait IsPostgresRelation | ||
{ | ||
/** | ||
* Get the wrapped and cast JSON column. | ||
* | ||
* @param \Illuminate\Database\Eloquent\Builder $query | ||
* @param \Illuminate\Database\Eloquent\Model $model | ||
* @param string $column | ||
* @param string $key | ||
* @return \Illuminate\Database\Query\Expression | ||
*/ | ||
protected function jsonColumn(Builder $query, Model $model, $column, $key) | ||
{ | ||
$sql = $query->getQuery()->getGrammar()->wrap($column); | ||
|
||
if ($model->getKeyName() === $key && in_array($model->getKeyType(), ['int', 'integer'])) { | ||
$sql = '('.$sql.')::int'; | ||
} | ||
|
||
return new Expression($sql); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<?php | ||
|
||
namespace Staudenmeir\EloquentJsonRelations\Relations\Postgres; | ||
|
||
use Illuminate\Database\Eloquent\Relations\MorphMany as Base; | ||
|
||
class MorphMany extends Base | ||
{ | ||
use MorphOneOrMany; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<?php | ||
|
||
namespace Staudenmeir\EloquentJsonRelations\Relations\Postgres; | ||
|
||
use Illuminate\Database\Eloquent\Relations\MorphOne as Base; | ||
|
||
class MorphOne extends Base | ||
{ | ||
use MorphOneOrMany; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
<?php | ||
|
||
namespace Staudenmeir\EloquentJsonRelations\Relations\Postgres; | ||
|
||
use Illuminate\Database\Eloquent\Builder; | ||
|
||
trait MorphOneOrMany | ||
{ | ||
use HasOneOrMany { | ||
getRelationExistenceQuery as getRelationExistenceQueryParent; | ||
} | ||
|
||
/** | ||
* Add the constraints for a 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 $this->getRelationExistenceQueryParent($query, $parentQuery, $columns) | ||
->where($this->morphType, $this->morphClass); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.