robsonvleite / datalayer

The data layer is a persistent abstraction component of your database that PDO (O data layer é um componente para abstração de persistência no seu banco de dados que usa PDO com prepared statements)
https://www.upinside.com.br
MIT License
144 stars 53 forks source link

Como Incluir o operador IN na função FIND #19

Closed tiagocaus closed 4 years ago

tiagocaus commented 4 years ago

Como faço para incluir o operador IN na função FIND?

public function find(?string $terms = null, ?string $params = null, string $columns = "*"): DataLayer
    {
        if ($terms) {
            $this->statement = "SELECT {$columns} FROM {$this->entity} WHERE {$terms}";
            parse_str($params, $this->params);
            return $this;
        }

        $this->statement = "SELECT {$columns} FROM {$this->entity}";
        return $this;
    }
rodineiti commented 4 years ago

Como faço para incluir o operador IN na função FIND?

public function find(?string $terms = null, ?string $params = null, string $columns = "*"): DataLayer
    {
        if ($terms) {
            $this->statement = "SELECT {$columns} FROM {$this->entity} WHERE {$terms}";
            parse_str($params, $this->params);
            return $this;
        }

        $this->statement = "SELECT {$columns} FROM {$this->entity}";
        return $this;
    }

Boa tarde, veja meu pull request que aplico estas funcionalidades.

https://github.com/rodineiti/datalayer/blob/develop/README.md

16

tiagocaus commented 4 years ago

@rodineiti Não entendi como usar o IN, no FIND. Poderia dar um exemplo?

rodineiti commented 4 years ago

@rodineiti Não entendi como usar o IN, no FIND. Poderia dar um exemplo?

Olá @hostcia , você está utilizando a LIB DataLayer no seu projeto certo?

Neste caso meu pull request precisaria ter sido aceito para que quando você atualizasse a Lib com composer update, ter acesso aos novos métodos que eu criei, que mostro neste exemplo como usar:

https://github.com/rodineiti/datalayer/blob/develop/example/where_example.php

<?php

/**
 * FIND WITH WHEREIN EXAMPLE
 */
$model = new User();
print "<h1>find with whereIn</h1>";
$users = $model
    ->whereIn("id", [53,55])
    ->find()
    ->fetch(true);

if ($users) {
    foreach ($users as $user) {
        dd($user->data());
    }
} else {
    echo "<h2>Not Users</h2>";
}

Mas ainda o @robsonvleite não deve ter visto o pull request.

Neste caso você poderia criar outro método na sua Model, como findCustom passando sua query diretamente montada, e os parametros, seria semelhante a Find atual, só que sem os termos, algo como:

<?php

public function findCustom(string $query) {
    $this->query = $query;
    return $this;
}

$model = new SuaModel();
$query = "select * from table where id in (1,2,3)";
$model->findCustom($query)->fetch(true);

Espero que ajude, por enquanto vamos aguardar o aceite do pull request, depois ficará muito mais fácil e flexível.

tiagocaus commented 4 years ago

@rodineiti entendi, então tem que esperar ele aceitar, né? Enviei uma mensagem para ele.

curruwilla commented 4 years ago

@rodineiti entendi, então tem que esperar ele aceitar, né? Enviei uma mensagem para ele.

Ele não precisa aceitar, só pegar o código direto

robsonvleite commented 4 years ago

Como faço para incluir o operador IN na função FIND?

public function find(?string $terms = null, ?string $params = null, string $columns = "*"): DataLayer
    {
        if ($terms) {
            $this->statement = "SELECT {$columns} FROM {$this->entity} WHERE {$terms}";
            parse_str($params, $this->params);
            return $this;
        }

        $this->statement = "SELECT {$columns} FROM {$this->entity}";
        return $this;
    }

Assim:

$users = (new User())
    ->find("first_name IN(:na, :nb, :nc)", "na=Robson&nb=Gustavo&nc=Kaue")
    ->fetch(true);