laravel:雄辩的例子将数据插入数据库

时间:2014-02-16 16:33:23

标签: model insert laravel primary-key eloquent

我很遗憾地问这个,但我来自codeIgniter并且很难理解雄辩的模型插入。这是一种为我使用模型的新方法。

我已阅读this article并了解一些基础知识。

我有以下示例。我有一个产品有很多属性,但相关的是品牌和产品名称。 (参见以下示例表)

产品:id(PK),名称,描述,brand_id 品牌:id(PK),名称

现在问题来了。我知道我可以创建一个新品牌,我知道如何创造一个新产品。但是,我不知道如何将两者连接在一起。这是我现在的一些代码。我想创建一个新产品并自动填充品牌表。这是控制器的一部分。

简而言之。我想要products.brand_id

中的brands.id
    $product = new Products;
    $product->name = "product1";
    $product->description = "description1";

    $brand = new Brands;
    $brand->name = "brand1"
    $product->brand()->associate($brand);

    $brand->save(); 
    $product->save(); 

使其更清晰。我有2个型号。产品和品牌型号。但是我不清楚模型中应该包含什么。这是我目前的产品型号。我认为品牌型号只应该有受保护的$ table =“brands”;模型类中的行。

 class Products extends Eloquent  {

    protected $table = 'products';

    public function brand()
    {
       return $this->hasOne('brands');
    }
  }

有人可以向我解释我做错了什么。我找不到一个好的教程如何使用关系在雄辩的模型中插入数据。大多数教程都是关于显示数据的。

1 个答案:

答案 0 :(得分:45)

好的,我已经重新阅读了你的问题,我认为你有一些问题,所以不要在主帖上留下任何进一步的评论,我想我可以回答一下,所以这里就是。< / p>

首先,你的关系是错误的类型和错误的方式。据我所知(当我在自己的工作中实施这些东西时)一个产品属于一个品牌 - 一个品牌可能有多个产品,但一个产品只能有一个品牌。首先你的数据库模式 - 你提到你有一个products表,其中包含普通列,然后是外键brand_id。到目前为止一切顺利:这与我解释这种关系的方式是一致的。

然而,您接着向我们展示您的模型。您将产品型号设为hasOne品牌 - 但实际上它属于品牌。你也没有定义关系的倒数 - 你需要双方使Laravel运作良好。除此之外,你的命名有点不合适 - 它可能会有效,但如果我们遵循Laravel惯例,我们会得到以下结果:

products模型中:Product.php

class Product extends Eloquent
{
    public function brand()
    {
        return $this->belongsTo('Brand');
    }
}

现在是brands型号:Brand.php

class Brand extends Eloquent
{
    public function products()
    {
        return $this->hasMany('Product');
    }
}

好的,到目前为止一切顺利。你会注意到各种约定:

  1. 表名称为复数(productsbrands
  2. 外键使用单数(brand_id
  3. 模型名称是单数和StudlyCase(表Productproducts,表Brandbrands
  4. 只要遵循Laravel约定,就不必指定$table属性(即表名是模型类名的复数snake_case版本
  5. 您应该双向定义关系(每个模型中一个,belongsTo的倒数为hasMany,还有hasOne / belongsTo和{{1}对}} / belongsToMany
  6. 检索关系的方法的名称是明智的 - 如果您期望一个结果,请将其设为单数(belongsToMany中的brand),如果您希望多个结果使其成为复数({{1在Product
  7. 在关系定义中使用模型类名(products而不是Brand或任何其他变体
  8. 如果您坚持这些规则,您的模型可以非常简洁但非常强大。

    现在,关于你如何实际定义真实数据,我觉得你发布的代码可能工作正常(这实际上取决于Laravel在幕后的聪明程度),但正如我在第一篇评论中所建议的,我d确保在调用$this->hasMany('Brand')之前保存了$this->hasMany('brands'),这样Laravel就不会迷失方向。因此,我会去:

    $brand

    通过这种方式,您知道在您开始使用它之前,您已经在数据库中拥有了已定义ID的品牌。

    你也可以用相反的方式定义关系,这样做可能不会造成大脑伤害:

    associate()

    您不需要在最后一行之后的任何一个模型上调用// create new brand and save it $brand = new Brand; $brand->name = "Brand 1"; $brand->save(); // create new product and save it $product = new Product; $product->name = "Product 1"; $product->description = "Description 1"; $product->brand()->associate($brand); $product->save(); ,因为它会自动获取// create new product and save it $product = new Product; $product->name = "Product 1"; $product->description = "Description 1"; $product->save(); // create new brand and save it $brand = new Brand; $brand->name = "Brand 1"; $brand->save(); // now add the product to the brand's list of products it owns $brand->products()->save($product); 的{​​{1}}值,将其放入{{1 }} save()字段,然后保存$brand

    有关详细信息,请参阅有关如何执行此关系插入的文档:http://laravel.com/docs/eloquent#one-to-many

    无论如何,希望这篇文章能够清除你的代码中的大量错误。正如我上面所说,这些都是约定,你可以反对它们,但是要这样做,你必须开始添加额外的代码,而对于其他开发人员来说这是非常难以理解的。我说如果你选择一个给定的框架,你也可以遵循它的约定。