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 fazer JOIN entre duas ou mais tabelas #72

Open vazjunior opened 1 year ago

vazjunior commented 1 year ago

Uso esse componentes mas até hoje não entendi como fazer um JOIN entre duas ou mais tabelas, alguém poderia dar um exemplo melhor do que tem na descrição do componente ?

hnqca commented 11 months ago

pelo que entendi, você faz o relacionamento pelas próprias classes modelo.

Exemplo:

Quero pegar os dados do usuário que está na tabela "users", mas também quero pegar o endereço deste mesmo usuário que está em outra tabela chamada "addresses".

você poderia fazer algo assim:

User.php:

    namespace App\Models;
    use CoffeeCode\DataLayer\DataLayer;

    class User extends DataLayer {

        public function __construct()
        {
            parent::__construct("users", []);
        }
    }

Address.php:

    namespace App\Models;
    use CoffeeCode\DataLayer\DataLayer;

    class Address extends DataLayer {

        public function __construct()
        {
            parent::__construct("addresses", []);
        }
    }

index.php:

    require_once __DIR__ . '/../vendor/autoload.php';

    use App\Models\Address;
    use App\Models\User;

    $userId = 1;

    $user    = (new User)->findById($userId);
    $address = (new Address)->findById($user->id_address);

    echo "{$user->name}, está morando na rua {$address->street}";

Tabelas:


CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    id_address INT,
    name VARCHAR(255) NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE addresses (
    id INT AUTO_INCREMENT PRIMARY KEY,
    street VARCHAR(255) NOT NULL,
    neighborhood VARCHAR(255) NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);