我正在开发一个使用基本模型从数据库表中获取所有行的轻型ORM。我有多个模型(问题,答案,评论),它们扩展了基础模型,并在每个模型中声明了受保护的$table
属性。这是我在基本模型中获取表行的方法:
public function all() {
$query = "SELECT * FROM {$this->table}";
$statement = $this->database->getConnected($this->connection)->prepare($query);
$statement->setFetchMode(PDO::FETCH_CLASS, 'Core\Database\Collection');
$statement->execute();
return $statement->fetchAll();
}
当我转储结果时,我得到类似的东西:
array(5) {
[0]=>
object(Core\Database\Collection)#31 (4) {
["id"]=>
string(1) "1"
["title"]=>
string(34) "What is your favourite video game?"
}
[1]=>
object(Core\Database\Collection)#244 (4) {
["id"]=>
string(1) "2"
["title"]=>
string(28) "What is your favourite food?"
}
}
我想知道是否可以将每个集合对象组合为一个大集合对象,而不是作为数组或单个对象返回?
我知道我仍然可以使用foreach
获得结果,但只是想让它成为一个真正的集合,而不仅仅是一个数组。
一个大集合对象
object(Core\Database\Collection) {
all: {
Namespace\Question {
["id"]=>
string(1) "1"
["title"]=>
string(34) "What is your favourite video game?"
},
Namespace\Question {
["id"]=>
string(1) "2"
["title"]=>
string(28) "What is your favourite food?"
}
}
}
答案 0 :(得分:1)
我的观点是你最好使用当前的对象数组。但是,您可以获取现有对象,并使用魔术__set()
方法将值附加到命名数组:
class Collection {
public function __set($name, $value) {
$this->$name[] = $value
}
}
据我所知, PDO::FETCH_INTO
无法与fetchAll
一起使用,因此您需要while
:
$collection = new Core\Database\Collection;
$statement->setFetchMode(PDO::FETCH_INTO, $collection);
$statement->execute();
while($statement->fetch()){}
return $collection;
应该返回类似的内容:
object(Core\Database\Collection)#1 (2) {
["id"]=>
array(2) {
[0]=>string(1) "1",
[1]=>string(1) "2"
}
["title"]=>
array(2) {
[0]=>string(34) "What is your favourite video game?",
[1]=>string(28) "What is your favourite food?"
}
}
真正唯一的另一种可能性是在您编辑的示例中显示一个对象,其属性是一个对象数组。你会这样做与你拥有的相似。只需获取类someNamespace\Question
的对象数组,并将其分配给类Core\Database\Collection
的另一个对象的属性:
$collection = new Core\Database\Collection;
$statement->setFetchMode(PDO::FETCH_CLASS, 'someNamespace\Question');
$statement->execute();
$collection->all = $statement->fetchAll();
return $collection;
应该返回类似的内容:
object(Core\Database\Collection)#1 (1) {
["all"]=> array(2) {
[0]=>
object(someNamespace\Question)#1 (2) {
["id"]=>
string(1) "1"
["title"]=>
string(34) "What is your favourite video game?"
}
[1]=>
object(someNamespace\Question)#2 (2) {
["id"]=>
string(1) "2"
["title"]=>
string(28) "What is your favourite food?"
}
}
}
我不知道Laravel,视频中的对象/数组语法似乎是自己开发的,所以很难解读。