Populating database with Eloquent ORM

Asked

Viewed 318 times

1

I have a database with some tables already populated, but now I have to popular the tables that have foreign key, I’m trying so:

$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 it returns me the error:

Call to Undefined method Illuminate Database Query Builder::()

model Produto:

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?

  • In which line does this error occur? It would be good if we could see the source code of the model Product (to see the definitions of the relations between the models).

2 answers

1


New Answer:

The original answer is kept at the end. It would be correct if the relationship were even hasMany...

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

Suffice correct the relations in the models that the 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 in other relationships.

Original Response

The method associate will work for associations belongsTo.

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


Every relationship belongsTo ("belongs to") is singular. For example, "address" and "user". The address belongs to one user. Therefore, I can use the associate:

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

// onde "endereco" BELONGS TO "usuario"

Already a relationship hasMany ("has several") is plural. The associate won’t work - because you can only associate an object with the "Associate", and not a collection or several objects.


In a relationship hasMany, makes the association by the other element, the element that belongsTo, thus:

$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();

0

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);

At the end I have a pivot table that stores the product...

but I’m not sure it’s right what I did... what do you think???

  • I made from examples of the codebright book

  • Is that a question or an answer? You need to get used to the fact that this is not a forum. Each post should not be a new message in a thread discussion. When you have additional information, edit your question. Leave the answer only when you have found a final solution. Then everyone can benefit from it and you can even accept it if it’s the best you thought. But if you want to supplement the question, edit the question

  • @Enrique: that’s right, it’s like the bigown said; we’re learning to keep this site well produced and well taken care of; take the opportunity to accept my answer to this question if you think it’s right... so I also get a few points and stay motivated to help! ;-)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.