laravel:雄辩的例子将数据插入数据库
Posted
技术标签:
【中文标题】laravel:雄辩的例子将数据插入数据库【英文标题】:laravel: eloquent example insert data to database 【发布时间】:2014-03-15 20:40:58 【问题描述】:很抱歉问这个问题,但我来自 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个模型。产品和品牌型号。但是,我不清楚模型中应该包含什么。这是我当前的产品模型。我认为 Brands 模型只应该有一个受保护的 $table = "brands";模型类中的行。
class Products extends Eloquent
protected $table = 'products';
public function brand()
return $this->hasOne('brands');
有人可以向我解释我做错了什么。我找不到一个很好的教程如何在具有关系的雄辩模型中插入数据。大多数教程都是关于显示数据的。
【问题讨论】:
您可能需要先保存品牌,然后再致电$product->associate();
试试看。
刚刚注意到您在帖子中说您“认为品牌模型只应该有一个protected $table = "brands";
行”,但据我所知,这不是真的。我很确定该模型必须具有 public function product() return $this->belongsTo('Product');
方法,这样在 $products 模型上对 associate()
的调用可以填充 Brands
模型上的 product_id
字段。我不是 100% 使用 hasOne
,但这绝对是使用 hasMany
的方式,并且在关系的倒数中也是同样的事情(即模型有一个 foreign_id
列)。
【参考方案1】:
好的,我已经重新阅读了你的问题,我认为你有一些问题,所以与其在主帖上留下任何进一步的 cmets,我想我可以尝试一个答案,所以就这样吧。
首先,你们的关系是错误的类型和错误的方式。据我了解(以及我在自己的工作中实现这些东西),产品属于一个品牌——一个品牌可能有多个产品,但一个产品只能有一个品牌。所以首先你的数据库模式 - 你提到你有一个带有普通列的products
表,然后是外键brand_id
。到目前为止一切顺利:这与我解释这种关系的方式是一致的。
但是,您接着向我们展示了您的模型。您的产品型号为hasOne
Brand - 但实际上它属于一个品牌。你也没有定义关系的倒数——你需要双方来让 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
)
模型名称是单数和StudlyCase(所以Product
用于表products
,Brand
用于表brands
)
只要遵循 Laravel 约定,就不必指定 $table
属性(即表名是模型类名的复数蛇形大小写版本
您应该以两种方式定义关系(每个模型中一个,belongsTo
的逆是 hasMany
,还有一对 hasOne
/belongsTo
和 belongsToMany
/belongsToMany
)
检索关系的方法的名称是合理的 - 如果您期望一个结果,请将其设为单数(brand
in Product
),如果您期望多个结果将其设为复数(products
in Brand
)
在您的关系定义中使用模型类名($this->hasMany('Brand')
而不是 $this->hasMany('brands')
或任何其他变体
如果您遵守这些规则,您的模型可以非常简洁但非常强大。
现在,至于您实际如何定义真实数据,我感觉您发布的代码可能运行良好(这实际上取决于 Laravel 在幕后的聪明程度),但正如我在第一条评论中建议的那样,我' d 确保我在调用 associate()
之前保存了 $brand
,这样 Laravel 就不会迷失在做什么。因此我会选择:
// 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();
这样,您知道数据库中的品牌已经定义好其 ID,然后再将其用于关系中。
你也可以用相反的方式定义关系,这样做可能不会那么伤脑筋:
// 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);
您不需要在最后一行之后在任一模型上调用save()
,因为它会自动获取$brand
的id
值,将其放入$product
的brand_id
字段中,然后保存$product
。
有关更多信息,请参阅有关如何插入此关系的文档:http://laravel.com/docs/eloquent#one-to-many
无论如何,希望这篇文章能解决您的代码中的大量问题。正如我上面所说,这些是约定,您可以违反它们,但要这样做,您必须开始添加额外的代码,这对于其他开发人员来说可能非常难以阅读。我说如果你选择一个给定的框架,你不妨遵循它的约定。
【讨论】:
不确定是谁投了反对票,但怎么会呢?我认为我的回答是经过深思熟虑的,并且回答了问题并建议对原始代码进行改进(因为它有点混乱,甚至可能没有按原样工作)。很高兴听到批评。 这正是我正在寻找的答案。它有效,也很重要:我得到了一个明确的命名约定示例。谢谢 完全没问题。如果您愿意,也可以免费免费投票以撤消投票的人的工作。 @alexrussell 这是一个很好的答案,但我需要你的帮助。我已经插入了new Brand
,现在我必须插入与插入品牌相关的多个产品。实现这一目标的最佳方法是什么?
@Tiger 我可以想象,假设你说的是你有一个已经存在的Brand
并且需要添加各种尚不存在的Product
s,你应该能够使用$brand->products()->createMany([])
(见here for Laravel's implementation)。但是,如果您的问题不是这么简单,我建议您提出一个新问题。以上是关于laravel:雄辩的例子将数据插入数据库的主要内容,如果未能解决你的问题,请参考以下文章