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

Buscar projetos que está em uma tabela e o nome do criador que está em outra. #20

Closed tiagocaus closed 4 years ago

tiagocaus commented 4 years ago

Preciso fazer a abstração de dados da tabela projetos. Como a tabela projetos tem relação com outras, junto preciso abstrair dados das tabelas Cadastro e Paises.

Tentei seguir as instruções desse video, mas fiquei confuso: https://www.youtube.com/watch?v=eD067TOeE-k

Em Models tenho:

Cadastro.php

<?php
namespace Source\Models;
use CoffeeCode\DataLayer\DataLayer;

class Cadastro extends DataLayer
{
    public function __construct()
    {
        parent::__construct("cadastro", []);
    }
}

Paises.php

<?php
namespace Source\Models;
use CoffeeCode\DataLayer\DataLayer;

class Pais extends DataLayer
{
    public function __construct()
    {
        parent::__construct("paises", []);
    }
}

Projetos.php

<?php
namespace Source\Models;
use CoffeeCode\DataLayer\DataLayer;

class Projeto extends DataLayer
{
    public function __construct()
    {
        parent::__construct("projetos", []);
    }
}

Na tela de onde exibo os projetos:

<?php
require __DIR__ . "/vendor/autoload.php";

$model = new \Source\Models\Projeto();
$projetos = $model->find("url = :url", "url=".$_GET['url']."")->fetch();

foreach ($projetos as $projeto){ 
   echo $projeto->titulo
}
?>

Como fazer, para que na mesma abstração $projeto-> eu consiga trazer dados das outras tabelas?

rodineiti commented 4 years ago

Preciso fazer a abstração de dados da tabela projetos. Como a tabela projetos tem relação com outras, junto preciso abstrair dados das tabelas Cadastro e Paises.

Tentei seguir as instruções desse video, mas fiquei confuso: https://www.youtube.com/watch?v=eD067TOeE-k

Em Models tenho:

Cadastro.php

<?php
namespace Source\Models;
use CoffeeCode\DataLayer\DataLayer;

class Cadastro extends DataLayer
{
    public function __construct()
    {
        parent::__construct("cadastro", []);
    }
}

Paises.php

<?php
namespace Source\Models;
use CoffeeCode\DataLayer\DataLayer;

class Pais extends DataLayer
{
    public function __construct()
    {
        parent::__construct("paises", []);
    }
}

Projetos.php

<?php
namespace Source\Models;
use CoffeeCode\DataLayer\DataLayer;

class Projeto extends DataLayer
{
    public function __construct()
    {
        parent::__construct("projetos", []);
    }
}

Na tela de onde exibo os projetos:

<?php
require __DIR__ . "/vendor/autoload.php";

$model = new \Source\Models\Projeto();
$projetos = $model->find("url = :url", "url=".$_GET['url']."")->fetch();

foreach ($projetos as $projeto){ 
   echo $projeto->titulo
}
?>

Como fazer, para que na mesma abstração $projeto-> eu consiga trazer dados das outras tabelas?

Faça desta forma:

Na sua model Cadastro, adicione um método que retornará os projetos

<?php
namespace Source\Models;
use CoffeeCode\DataLayer\DataLayer;

class Cadastro extends DataLayer
{
    public function __construct()
    {
        parent::__construct("cadastro", []);
    }

    /**
     * @return Projeto|null
     */
    public function projetos(): ?Projeto
    {
        return ($this->id) ? (new Projeto())
            ->find("cadastro_id = :cadastro_id", "cadastro_id={$this->id}") : null;
    }
}

Ao utilizar ficaria desta forma:

<?php
require __DIR__ . "/vendor/autoload.php";

$model = new \Source\Models\Cadastro();
$cadastro = $model->findById(1);

var_dump($cadastro->projetos()->fetch(true));

?>
robsonvleite commented 4 years ago

O usuário tem um endereço? Então na classe usuário você precisa ter um método endereço (address) para buscar os endereços desse usuário.