我很遗憾地问这个,但我来自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');
}
}
有人可以向我解释我做错了什么。我找不到一个好的教程如何使用关系在雄辩的模型中插入数据。大多数教程都是关于显示数据的。
答案 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');
}
}
好的,到目前为止一切顺利。你会注意到各种约定:
products
,brands
)brand_id
)Product
为products
,表Brand
为brands
)$table
属性(即表名是模型类名的复数snake_case版本belongsTo
的倒数为hasMany
,还有hasOne
/ belongsTo
和{{1}对}} / belongsToMany
)belongsToMany
中的brand
),如果您希望多个结果使其成为复数({{1在Product
)products
而不是Brand
或任何其他变体如果您坚持这些规则,您的模型可以非常简洁但非常强大。
现在,关于你如何实际定义真实数据,我觉得你发布的代码可能工作正常(这实际上取决于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
无论如何,希望这篇文章能够清除你的代码中的大量错误。正如我上面所说,这些都是约定,你可以反对它们,但是要这样做,你必须开始添加额外的代码,而对于其他开发人员来说这是非常难以理解的。我说如果你选择一个给定的框架,你也可以遵循它的约定。