HasMany não está dando certo.

Marcos Birro Calixto Criador 07/05/2018
Marcos Birro Calixto

Carlos, boa tarde. Vou mandar em dois tickets porque não está cabendo.

 
Criador Marcos Birro Calixto 07/05/2018
Marcos Birro Calixto

class Gestor extends Model

{

    protected $fillable = ['matricula', 'nome', 'email'];

     public function centrocustos()

    {

        return $this->HasMany(Centrocusto::class);

    }

}

Criador Marcos Birro Calixto 07/05/2018
Marcos Birro Calixto

class GestorController extends Controller

{

    private $gestor;

    private $totalpage = 10;

    

    public function __construct(Gestor $gestor)

    {

        $this->gestor = $gestor;

    }

    public function index()

    {

        $gestors = Gestor::All();

        //dd($gestor);

        $centrocustos = $gestors->centrocustos;

        //dd($centrocustos);

        return view('admin.cadastros.gestores.index', compact('gestors', 'centrocustos'));

    }

    } 

Criador Marcos Birro Calixto 07/05/2018
Marcos Birro Calixto

A odéia é listar cada gestor com seus devidos centrolucros que pode ser vários. 

A mensagem que está dando é:

"Property [centrocustos] does not exist on this collection instance."

Criador Marcos Birro Calixto 07/05/2018
Marcos Birro Calixto

    public function index()    {

        $gestors = Gestor::get();        

        $centrocustos = $gestors->centrocustos()->get();            

         return view('admin.cadastros.gestores.index', compact('gestors', 'centrocustos'));

    } 

Mensagem: "Method Illuminate\Database\Eloquent\Collection::centrocustos does not exist."

Manager Carlos Ferreira 07/05/2018
Carlos Ferreira

Olá, Marcos!
Tudo bem?

Está errado a forma como usou o relacionamento de tabelas.

Só pode trazer um relacionamento direto quando tem um objeto específico, e não uma coleção.

Ex:
// Objeto específico:
$objeto = Model::find(2);

// Coleção de itens:
$items = Model::get();

No caso, pra trazer um relacionamento One to Many precisa trazer a partir de um objeto, assim:
$gestor = Gestor::find(2);
$centrocustos = $gestor->centrocustos; //ou: $gestor->centrocustos()->get();

No caso, se precisar retornar uma coleção pode fazer assim:
$gestors = Gestor::with('centrocustos')->get();

Na view, exemplo:
@foreach ($gestors as $gestor)
    {{ $gestor->nome }}
    Centros custos:
    @foreach ($gestor->centrocustos as $centrocusto)
        {{ $centrocusto->nome }}
    @endforeach
@endforeach

Criador Marcos Birro Calixto 08/05/2018
Marcos Birro Calixto

Carlos, boa tarde. Não deu certo. Por favor, veja se pode me ajudar.

Minha model Gestor

    public function centrocustos()

    {

        return $this->hasMany(Centrocusto::class);

    }

Meu controller CentrocustoController

    public function index()

    {

        $centrocustos = $gestor->centrocustos; 

        $gestors = Gestor::with('centrocustos')->get();

        return view('admin.cadastros.centrocusto.index', compact('centrocustos', 'gestors'));

    }

Minha Index.blade

            @foreach ($gestors as $gestor)

                <td>{{ $gestor->nome }}</td>

                <td>{{ $gestor->matricula }}</td>

                <td>{{ $gestor->email }}</td>                

                @foreach ($gestor->centrocustos as $centrocusto)

                    {{ $centrocusto->nome }}

                @endforeach

            @endforeach

 

Erro: "Undefined variable: gestor"

Parece que é aqui: $centrocustos = $gestor->centrocustos;

 

 

Criador Marcos Birro Calixto 08/05/2018
Marcos Birro Calixto

Meu relacionamento é um gestor para vários centro de custos.

Manager Carlos Ferreira 08/05/2018
Carlos Ferreira

O erro tá no método index()

Nessa linha:
$centrocustos = $gestor->centrocustos;

Você usa uma variável chamada $gestor, mas, não criou antes, por isso o erro.
Remove essa linha :)

Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!