作用域的存在避免了在联表查询的链式方法中显式的申明表名,使联表查询语句简洁易懂
在联表查询中select where order limit
等方法都有默认作用域,让你明确这些链式方法是作用于那张表。
例如:查找积分前3的用户的id和用户名,及其在$time时间后发布主题的id和标题。
$db->user->select('id', 'name')->sub('account')->order('score', true)->limit(3)->with('post')->select('id', 'title')->where('time', '>', $time)->find();
下面解析下示例中的作用域
1 主表user作用域,$db->user
后就进入主表user的作用域,其后接方法select('id', 'name')
是作用于主表user也就是查询主表的id与name,直到遇到连表方法才跳出主表作用域进入从表作用域。
2 子查询从表account作用域,sub('account')
进入子查询从表account作用域,其后接方法order('rating', true)
和limit(3)
作用于从表account,直到遇到其它连表方法才跳出其作用域进入其它从表作用域。
3 with联表查询从表post作用域,with('post')
进入with连表查询从表post作用域,select('id', 'title')
和where('time', '>', $time)
作用于从表post。
4 最后的查询方法find作用域为主表,连表查询最后查询方法get find等的作用域又跳回主表,其参数只作用于主表。