PDO Fetch Class作为分组集合对象而不是数组

时间:2018-02-27 20:12:11

标签: php class oop object pdo

我正在开发一个使用基本模型从数据库表中获取所有行的轻型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?"
        }
    }
}

1 个答案:

答案 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,视频中的对象/数组语法似乎是自己开发的,所以很难解读。