Object property coming from JSON is not accessible

3

I'm working with framework Laravel on versão 5.2 I'm developing a API where I have a Painel administrativo that produces and manages content, in this case produto , and I have another site that will consume API do painel administrativo where it has to list all products.

Within produto I have several items like: images, category, subcategory, among others. I am consuming this API via JQUERY by issuing the $.getJSON() command. But I'm having trouble accessing my product items like images.

In my Model produto I did as follows:

use SoftDeletes;

protected $fillable = [
    'CdSubCategoria',
    'NmProduto',
    'DscProduto',
    'VlUnit',
    'UnitEmEstoque',
    'FlgDescontinuado',
    'FlgProdutoVisivel',
    'Visivel_Ini',
    'Visivel_Fim',
    'FlgPontua',
    'QtdPontos',
    'MaxPontosPorSubCategoria'
];
protected $primaryKey = 'CdProduto';
protected $dates = ['deleted_at'];

public function subCategoria()
{
    return $this->belongsTo('App\SubCategoria','CdSubCategoria','CdSubCategoria');
}

public function imagens(){
    return $this->hasMany('App\Imagem', 'CdProduto', 'CdProduto');
}

public function lotes(){
    return $this->hasMany('App\LoteProduto', 'CdProduto', 'CdProduto');
}

public function tipo_produto_embalagem(){
    return $this->belongsTo('App\TipoProdutoEmbalagem', 'CdProduto', 'CdProduto');
}

In my Controller Produto which is where access with $.getJSON() I did the following, a index() function that identifies the first metodo of my controller :

public function index(){
    $produtos =  Produto::all();

    if(Request::wantsJson()){
        return compact('produtos');
    }else{
        return view('Produto.listProduto', compact('produtos'));
    }
}

My return compact('produtos') is what sends when I make requisição .

On my site I'm getting this array and I make a .each() on my váriavel within this .each() that I'm trying to access my product items as images.

My code looks like this:

   $.getJSON('http://localhost:8000/produtos', function(data) {
      $('#todosProdutos').html('');
        $.each(data, function (key, item) {
            var ANTIGO = $('#todosProdutos').html();
            console.log(item.imagens); //Aqui dei um console para tentar verificar as imagens porém retorna undefined

            var html = ANTIGO + 'MEU HTML';
        });
        //console.log(html);
       // $('#todosProdutos').html(html);
        console.log(data);
    });

In my console.log(item.imagens) is returning undefined in which part of the process am I missing? I tried accessing others as a category, and it's not working either.

When I give console.log(item) it returns only the items that are actually in the same product table, as an example: NmProduct, VlUnit, UnitEmEstoque, etc.

    
asked by anonymous 10.10.2016 / 15:38

2 answers

1

In Laravel there are two ways to load the relationship: eager loading constraints and lazy loading .

The first, which is eager loading constraints (loading anxiously, loads the relationships in advance, before accessing the values of the defined relationships. lazy loading), only accesses when you call the relationship.

You can not use lazy loading for JSON . So when it comes to Ajax requests, I always recommend using eager loading constraints , so that the relationship data will always be available.

This operation is done using the with method.

See:

public function index(){
    $produtos =  Produto::with('imagens')->get();

    if(Request::wantsJson()){
        return compact('produtos');
    }else{
        return view('Produto.listProduto', compact('produtos'));
    }
}
    
10.10.2016 / 15:44
1

Failed to load the relationship, this is not automatic with it done:

Using the with command from post-tag" title="show questions tagged 'eloquent'"> eloquent , relationships are loaded:

public function index()
{
    $produtos =  Produto::with('imagens')
                         ->get();

    if(Request::wantsJson())
    {
        return compact('produtos');
    }

    return view('Produto.listProduto', compact('produtos'));
}

If you need to load the other relationships then add ->with('') with the names of the relationships :

Example:

$produtos =  Produto::with('imagens')
                    ->with('lotes')
                    ->get();

or with a array

$produtos =  Produto::with(['imagens','lotes'])
                    ->get();
    
10.10.2016 / 15:40