Created
December 17, 2014 10:12
-
-
Save goranprijic/c578acb0086e8cd85179 to your computer and use it in GitHub Desktop.
Check if table is already joined in Laravel Query Builder
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
<?php | |
class BaseModel extends Eloquent { | |
public static function isJoined($query, $table) | |
{ | |
$joins = $query->getQuery()->joins; | |
if($joins == null) { | |
return false; | |
} | |
foreach ($joins as $join) { | |
if ($join->table == $table) { | |
return true; | |
} | |
} | |
return false; | |
} | |
} |
->contains
can also be a callback function. I had to use this as my joined table wasn't just a table name but instead an alias, something like table_name AS permissions_table
.
return collect($query->getQuery()->joins)->pluck('table')->contains(function ($value, $key) use ($table) {
if (is_a($value, Illuminate\Database\Query\Expression::class)) {
/** @var Illuminate\Database\Query\Expression $value */
return $value->getValue() === $table; // $table is something like "table_name AS permissions_table"
}
return $value === $table;
});
Just throwing in another possible solution that uses native php array functions and thus should have better performance:
return array_search($table, array_column((array)$builder->getQuery()->joins, 'table'));
Be sure to explicitly check the return value for false
using ===
.
Thanks for this snippet, very useful
This method detects all kinds of joins (leftJoin()
, join()
, etc.)
Clarifying just in case someone else was wondering!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for this @goranprijic, and to @BadChoice and @arnoudhgz for the optimizations. I'm using Eloquent separate from Laravel, so I use the
make()
method on theCollection
class directly:$isJoined = Collection::make($query->getQuery()->joins)->pluck('table')->contains($table);