-
-
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; | |
} | |
} |
Thanks a lot.
You can use the collections to simplify it a bit
public static function isJoined($query, $table){
$joins = collect($query->getQuery()->joins);
return $joins->pluck('table')->contains($table);
}
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!
Awesome