-
-
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; | |
| } | |
| } |
Awesome
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!
Thanks for the solution.