讨论数量:
我找到了 2 种方法
User::first()->getQuery()->from;
\DB::table('Customer', 'C')->from;
补充
\Illuminate\Database\Query\Builder::macro('alias', function(){
return 'x'; // 虽然可以返回数据,但是这里的 $this 并不是指向当前的 model 或 db 类,放弃
});
\Illuminate\Database\Eloquent\Builder::macro('alias', function () {
return 'xx'; // 同上
});
User::where('id', 1)->alias()); // 返回 xx
DB::table('User', 'U'); // 返回 x
// =========== 分割线 ==================
$alias = function ($a) {
if ($a instanceof \Illuminate\Database\Query\JoinClause) {
/** @var \Illuminate\Database\Query\Expression $table */
$table = $a->table;
$from = $table->__toString();
return false === strpos($from, ' as ') ? $from : trim(explode(' as ', $from)[1], '`');
}
if (property_exists($a, 'from')) {
$from = $a->from;
return false === strpos($from, ' as ') ? $from : explode('as ', $from)[1];
}
if (method_exists($a, 'getQuery')) {
$from = $a->getQuery()->from;
return false === strpos($from, ' as ') ? $from : explode(' as ', $from)[1]; // 不存在别名返回表明,或改成空
}
return false;
};
$user = User::where('id', 1);
dump($alias($user)); // users, 这类默认没有别名
$user = User::leftJoinSub($user, 'uu', 'uu.id', '=', 'users.id')->where('id', 1);
dump($alias($user)); // users
dump($alias($user->getQuery()->joins[0])); // {prefix}uu 前缀 + 别名
$user = DB::table('User', 'U');
dump($alias($user)); // U
// $alias() 丢到助手函数里面就行了
我找到了 2 种方法
User::first()->getQuery()->from;
\DB::table('Customer', 'C')->from;
补充