Populating database with Eloquent ORM

1

I have a database with some tables already populated, but now I have to populate the tables that have a foreign key, I'm trying like this:

$tamanho = Tamanho::find(2);
$genero = Genero::find(1);
$categoria = Categoria::find(2);
$estampa = Estampa::find(1);
$pedido = Pedido::find(1);

$produto = new Produto;
$produto->descricao = 'Lançamento 2012';
$produto->tamanhos()->associate($tamanho);
$produto->generos()->associate($genero);
$produto->categorias()->associate($categoria);
$produto->estampas()->associate($estampa);
$produto->quantidade = '120';
$produto->vunitario = '50';
$produto->save();

$produto->pedidos()->save($pedido);
$pedido->produtos()->save($produto);

But I get the error:

  

Call to undefined method Illuminate \ Database \ Query \ Builder :: associate ()

model Product:

class Produto extends Eloquent
{
// Produtos has_many Tamanhos
public function tamanhos()
{
    return $this->hasMany('Tamanho');
}

// Produtos has_many Generos
public function generos()
{
    return $this->hasMany('Genero');
}

// Produtos has_many Estampas
public function estampas()
{
    return $this->hasMany('Estampa');
}

// Produtos belongs_to Categorias
public function categorias()
{
    return $this->belongsTo('Categoria');
}

// Produtos belongs_to_many Pedidos
public function pedidos()
{
    return $this->belongsToMany('Pedido');
}

}

What could be wrong?

    
asked by anonymous 07.02.2014 / 16:50

2 answers

1

New Response:

The original response is maintained at the end. It would be correct if the relation was even hasMany ...

But what is wrong is precisely the definition of the relationship in the model! As hasMany is being used, it is understood that a product can have several sizes, several genres, and several prints. But it belongs to ONE CATEGORY ONLY (due to belongsTo ).

Just correct relationships in templates that code using associate will work just the way it is!

class Produto extends Eloquent
{
    // Produto belongs to Tamanho
    public function tamanho()
    {
        return $this->belongsTo('Tamanho');
    }
}

class Tamanho extends Eloquent
{
    // Tamanhos has many Produtos
    public function produtos()
    {
        return $this->hasMany('Produto');
    }
}

Make corrections to other relationships.

Original answer

The associate method will work for belongsTo associations.

In your case, you seem to be trying to use it in hasMany .

All belongsTo ("belongs to") is singular . For example, "address" and "user". The address belongs to a one user. So I can use associate :

$usuario = Usuario::find(3);
$endereco = Endereco::find(9);
$usuario->endereco()->associate($endereco);

// onde "endereco" BELONGS TO "usuario"

A hasMany relation ("has several") is plural . The associate will not work - you can only associate an object with the "associate" and not a collection or multiple objects.

In a hasMany relation, make the association by the other element, the element that belongsTo , like this:

$produto = new Produto;
$produto->descricao = 'Lançamento 2012';
$produto->quantidade = '120';
$produto->vunitario = '50';
$produto->save();

$tamanho->produto()->associate($produto)->save();
$genero->produto()->associate($produto)->save();
$categoria->produto()->associate($produto)->save();
$estampa->produto()->associate($produto)->save();
    
07.02.2014 / 17:10
0

I got popular doing this:

$produto = new Produto;
$produto->descricao = 'Lançamento 2012';
$produto->tamanho_id = $tamanho->id;
$produto->genero_id = $genero->id;
$produto->categoria_id = $categoria->id;
$produto->estampa_id = $estampa->id;
$produto->quantidade = '120';
$produto->vunitario = '50';
$produto->save();

$produto->pedidos()->save($pedido);
$pedido->produtos()->save($produto);

In the end I have a pivot table that stores the product_id and i_id request, so that I can make an inquiry to the products of a particular request and leave the bd more organized ...

But I'm not sure if it's correct what I did ... What do you think ???

    
07.02.2014 / 17:29