xire28 / redbean-traversing
为红宝书添加通过关联进行遍历的功能
v1.3.0
2016-02-18 19:41 UTC
Requires
- php: >=5.4.0
README
为红宝书添加通过关联进行遍历的功能
要求
- PHP >= 5.4.0
安装
使用 Composer
composer require xire28/redbean-traversing
注意
此包由两部分组成
MulticallProxy
,用于将集合用作对象,并对所有项目同时执行操作SQLConditionBuilder
,用于逐步构建 SQL 查询过滤器
示例
种子
- 美利坚合众国
- 阿拉巴马州
- 莱昂内尔·里奇(1949-06-20)
- 费利西亚·戴(1979-06-28)
- 阿拉斯加州
- 安娜·格蕾丝曼(1999-08-01)
- 亚利桑那州
- 艾玛·斯通(1988-11-06)
- 阿肯色州
- 阿拉巴马州
- 中国
- 仁寿
- 王磊(1978-02-01)
- 仁寿
检索所有美国人员
<?php
class Model_Country extends RedBean_SimpleModel
{
use RedbeanTraversing\ModelTraversing;
public function people(){
return $this->multi()->ownState->ownPerson;
}
}
$usa = R::load('country', 1);
echo '<ul>';
foreach($usa->people() as $person){
echo "<li>{$person->fullName}</li>";
}
echo '</ul>';
?>
生成的 SQL 语句
SELECT `country`.* FROM `country` WHERE (`id` IN ( 1 ))
SELECT `state`.* FROM `state` WHERE country_id = '1'
SELECT `person`.* FROM `person` WHERE state_id = '1'
SELECT `person`.* FROM `person` WHERE state_id = '2'
SELECT `person`.* FROM `person` WHERE state_id = '3'
SELECT `person`.* FROM `person` WHERE state_id = '4'
输出
- Lionel Richie
- Felicia Day
- Anna Graceman
- Emma Stone
检索所有美国成年人员
<?php
class BaseModel extends RedBean_SimpleModel
{
use RedbeanTraversing\ModelTraversing;
}
class Model_Country extends BaseModel
{
public function adultPersons(){
return $this->multi()->ownState->isAdult()->ownPerson;
}
}
class Model_State extends BaseModel
{
use PersonScope;
}
trait PersonScope {
public function isAdult(){
return $this->personOlderThan(17);
}
public function personOlderThan($age){
return $this->where('TIMESTAMPDIFF(YEAR, born_at, CURDATE()) > ?', $age);
}
}
$usa = R::load('country', 1);
echo '<ul>';
foreach($usa->adultPersons() as $person){
echo "<li>{$person->fullName}</li>";
}
echo '</ul>';
?>
生成的 SQL 语句
SELECT `country`.* FROM `country` WHERE (`id` IN ( 1 ))
SELECT `state`.* FROM `state` WHERE country_id = '1'
SELECT `person`.* FROM `person` WHERE state_id = '1' AND TIMESTAMPDIFF(YEAR, born_at, CURDATE()) > 17
SELECT `person`.* FROM `person` WHERE state_id = '2' AND TIMESTAMPDIFF(YEAR, born_at, CURDATE()) > 17
SELECT `person`.* FROM `person` WHERE state_id = '3' AND TIMESTAMPDIFF(YEAR, born_at, CURDATE()) > 17
SELECT `person`.* FROM `person` WHERE state_id = '4' AND TIMESTAMPDIFF(YEAR, born_at, CURDATE()) > 17
输出
- Lionel Richie
- Felicia Day
- Emma Stone
构建复杂查询
<?php
class BaseModel extends RedBean_SimpleModel
{
use RedbeanTraversing\ModelTraversing;
}
class Model_Country extends BaseModel {}
class Model_State extends BaseModel {}
$usa = R::load('country', 1);
echo '<ul>';
foreach($usa->multi()->group(function($q){ return $q->where('name LIKE "Ar%"')->_or()->where('name = ?', 'Alabama'); })->ownState->ownPerson as $person){
echo "<li>{$person->fullName}</li>";
}
echo '</ul>';
?>
生成的 SQL 语句
SELECT `country`.* FROM `country` WHERE (`id` IN ( 1 ))
SELECT `state`.* FROM `state` WHERE country_id = '1' AND ( name LIKE "Ar%" OR name = 'Alabama' )
SELECT `person`.* FROM `person` WHERE state_id = '1'
SELECT `person`.* FROM `person` WHERE state_id = '3'
输出
- Lionel Richie
- Felicia Day
- Emma Stone