laravel数据库查询如何优雅简洁的设置表别名

在使用laravel的数据库操作时 表的别名主要通过user as u1或者$tablename = (new model())->getTable()的方式设置,感觉不够优雅(每次都需要额外定义变量),现在的用法:

$userTable = $this->getTable();
$bookTable = (new BookModel())->getTable();
$this->getDB()
->select('查询字段')
->leftjoin($bookTable, $thisTable . ' . book_id',  $bookTable . '.id')

因此想问下在laravel原有机制里面有优雅简洁的实现方式吗 之前用过Yii2的查询:

UserModel::find()
->select('这里是查询的字段')
->alias('usermodel表的别名')
->lefjoin(['bookmodel别名'=>BookModel::tableName()])

Laravel中有类似的alias方法和通过数组取别名的方法吗,或者如果要自定义实现,需要怎么去设计

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 8
User::query()->from('users','u')
    ->leftJoin('books as b','u.id','=','b.user_id')
    ->get();
1年前 评论

既然用model了,为何不直接用model的关联?我看很多人用model还写这种关联,有点不明白。复杂的语句不是可以用DB么?

1年前 评论
pawn (楼主) 1年前
pawn (楼主) 1年前
Rache1 1年前

如果想只使用一个sql语句查出所有数据,就使用左联或右联。 但我从来都不这样做,我都是先查出模型,再查其他需要输出的字段。

1年前 评论

推荐使用子连接查询来设置别名,参考官方例子:

$latestPosts = DB::table('posts')
                   ->select('user_id', DB::raw('MAX(created_at) as last_post_created_at'))
                   ->where('is_published', true)
                   ->groupBy('user_id');

$users = DB::table('users')
        ->joinSub($latestPosts, 'latest_posts', function ($join) {
            $join->on('users.id', '=', 'latest_posts.user_id');
        })->get();
1年前 评论

可以通过laravel的 scope或者别的机制自己封装一下 例如scope机制的

public function scopeAlias($query, $name, $onlyTableName=false)
{
    $tableName = self::getTable().' as '.$name;

    if ($onlyTableName) {
        return $tableName;
    }

    return $query->from($tableName);
}

//使用起来直接调用
  UserModel::alias('usermodel表的别名')
7个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!