xire28/redbean-traversing

为红宝书添加通过关联进行遍历的功能

v1.3.0 2016-02-18 19:41 UTC

This package is not auto-updated.

Last update: 2024-09-20 09:28:29 UTC


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