-
-
Save goranprijic/c578acb0086e8cd85179 to your computer and use it in GitHub Desktop.
| <?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; | |
| } | |
| } |
Yes and avoid the temporary variable also :)
return collect($query->getQuery()->joins)->pluck('table')->contains($table);
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 the Collection class directly:
$isJoined = Collection::make($query->getQuery()->joins)->pluck('table')->contains($table);
->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!
You can use the collections to simplify it a bit