Задать вопрос
@BiStudiOfficial
Python разработчик, работаю с aiogram. Unity C#

Какой лучше взять ORM?

на php сервере поднимаю orm
какую библиотеку лучше использовать для занесения данных в бд
(планируется большой приток юзеров)
  • Вопрос задан
  • 493 просмотра
Подписаться 2 Простой Комментировать
Решения вопроса 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Это хороший вопрос, но ответ на него зависит от вашего уровня. Очень сильно зависит.
Специалисты вам наверняка посоветуют Doctrine или Cycle. Но вы их явно не потянете.
Для знакомства с ORM я бы порекомендовал Eloquent, при всех минусах этого выбора.

Но если честно, то учитывая, что вы ищете замену RB, я бы порекомендовал начать с самого простого.
spoiler
Написать ORM руками. Причем даже не классический, поддерживающий связи и квери билдер, а совсем простой Table Gateway, типа такого:
abstract class BasicTableGateway
{
    protected $db;
    protected $table;
    protected $fields;
    protected $primary = 'id';

    public function __construct(\PDO $db)
    {
        $this->db = $db;
    }
    public function read($id): ?array
    {
        $stmt =$this->db->prepare("SELECT * FROM `$this->table` WHERE `$this->primary`=?");
        $stmt->execute([$id]);
        return $stmt->fetch();
    }
    public function insert($data): int
    {
        $this->validate($data);

        $fields = '`'.implode("`,`", array_keys($data)).'`';
        $placeholders = str_repeat('?,', count($data) - 1) . '?';
        $sql = "INSERT INTO `$this->table` ($fields) VALUES ($placeholders)";
        $this->db->prepare($sql)->execute(array_values($data));
        return $this->db->lastInsertId();
    }
    protected function validate($data)
    {
        $diff = array_diff(array_keys($data), $this->fields);
        if ($diff) {
            throw new \InvalidArgumentException("Unknown field(s): ". implode($diff));
        }
    }
}

И дальше применять его примерно так
class UserGateway extends BasicTableGateway {
    protected $table = 'gw_users';
    protected $fields = ['email', 'password', 'name', 'birthday'];
}
$userGateway = new UserGateway($pdo);
$data = [
    'email' => 'foo@bar.com',
    'password' => 123,
    'name' => 'Fooster',
];
$id = $userGateway->insert($data);
$user = $userGateway->read($id);
echo json_encode($user),PHP_EOL;

И никаких тебе "бинов" - обычный ПДО, обычные массивы, все просто и наглядно.


Хотя пожалуй Dr. Bacon прав, вам и это будет сложновато. Возьмите лучше просто функцию:
function pdo($pdo, $sql, $args = NULL)
{
    if (!$args)
    {
         return $pdo->query($sql);
    }
    $stmt = $pdo->prepare($sql);
    $stmt->execute($args);
    return $stmt;
}

и дальше просто запросами

// Create
pdo($pdo, "INSERT INTO users VALUES (null, ?,?,?)", [$name, $email, $password]);
// Read
$user = pdo($pdo, "SELECT * FROM users WHERE email=?", [$email])->fetch();
// Update
pdo($pdo, "UPDATE users SET name=:name WHERE id=:id", ['id'=>$id, 'name'=>$name]);
// Delete
$deleted = pdo($pdo, "DELETE FROM users WHERE id=?", [$id])->rowCount();


После того, как SQL будет отскакивать от зубов - можно будет посмотреть в сторону какого-нибудь ORM
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы