Model laravel:向数据库插入数据的有力示例
我很抱歉问这个问题,但我来自codeIgniter,很难理解雄辩的模型插入。对我来说,这是一种处理模型的新方法 我现在已经阅读并理解了一些基础知识 我有下面的例子。我有一个产品,它有很多属性,但相关的是品牌和产品名称。(请参见以下示例表) 产品:标识(PK)、名称、说明、品牌标识 品牌:id(PK),名称 现在问题来了。我知道我可以创造一个新品牌,我知道如何创造一个新产品。然而,我不知道如何将两者连接在一起。这是我现在掌握的一些代码。我想创建一个新产品并自动填充品牌表。这是控制器现在的一部分 简而言之。我想要产品内的brands.id.brand\u idModel laravel:向数据库插入数据的有力示例,model,insert,laravel,primary-key,eloquent,Model,Insert,Laravel,Primary Key,Eloquent,我很抱歉问这个问题,但我来自codeIgniter,很难理解雄辩的模型插入。对我来说,这是一种处理模型的新方法 我现在已经阅读并理解了一些基础知识 我有下面的例子。我有一个产品,它有很多属性,但相关的是品牌和产品名称。(请参见以下示例表) 产品:标识(PK)、名称、说明、品牌标识 品牌:id(PK),名称 现在问题来了。我知道我可以创造一个新品牌,我知道如何创造一个新产品。然而,我不知道如何将两者连接在一起。这是我现在掌握的一些代码。我想创建一个新产品并自动填充品牌表。这是控制器现在的一部分 简
$product = new Products;
$product->name = "product1";
$product->description = "description1";
$brand = new Brands;
$brand->name = "brand1"
$product->brand()->associate($brand);
$brand->save();
$product->save();
让它更清楚。我有两个模型。产品和品牌模型。然而,我不清楚模型中应该包含什么。这是我目前的产品型号。我认为品牌模型只应该有一个受保护的$table=“brands”;模型类中的行
class Products extends Eloquent {
protected $table = 'products';
public function brand()
{
return $this->hasOne('brands');
}
}
谁能给我解释一下我做错了什么。我找不到一个好的教程如何在有关系的雄辩模型中插入数据。大多数教程都是关于显示数据的。好吧,我已经重新阅读了你的问题,我认为你有一些地方错了,所以我不想在主要帖子上留下任何进一步的评论,我想我可以尝试一下答案,就这样吧 首先,你们的关系是错误的类型和错误的方式。根据我的理解(以及我在自己的工作中实现这些东西),一个产品属于一个品牌——一个品牌可能有多个产品,但一个产品只能有一个品牌。因此,首先是您的DB模式—您提到您有一个带有正常列的
products
表,然后是外键brand\u id
。到目前为止还不错:这与我对这段关系的解释是一致的
然而,你接着向我们展示你的模型。您的产品型号是hasOne,但实际上它属于一个品牌。你也不需要定义关系的相反方向——你需要双方共同努力才能让Laravel工作得很好。除此之外,您的命名有点不正常-它可能会工作,但如果我们遵循Laravel约定,我们会得到以下结果:
在products
模型中:Product.php
class Product extends Eloquent
{
public function brand()
{
return $this->belongsTo('Brand');
}
}
class Brand extends Eloquent
{
public function products()
{
return $this->hasMany('Product');
}
}
现在是brands
模型:Brand.php
class Product extends Eloquent
{
public function brand()
{
return $this->belongsTo('Brand');
}
}
class Brand extends Eloquent
{
public function products()
{
return $this->hasMany('Product');
}
}
好的,到目前为止还不错。您会注意到各种约定:
产品
,品牌
)brand\u id
)产品,表品牌)
$table
属性(即,table name是模型类名的复数蛇形版本)belongsTo
,相反的是hasMany
,还有对hasOne
/belongsTo
和belongsToMany
/belongsToMany
)品牌
在产品
中),如果您期望多个结果,则将其设置为复数(产品
在品牌
中)$this->hasMany('Brand')
而不是$this->hasMany('brands')
或任何其他变体associate()之前保存$brand
)
,这样拉威尔就不会在做什么时迷失方向。因此,我会:
// 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\u id
字段,然后保存$product
有关更多信息,请参阅有关如何进行此关系插入的文档:
无论如何,希望这篇文章能澄清你的代码中的许多错误。正如我上面所说的,这些都是约定,你可以违背它们,但要做到这一点,你必须开始添加额外的代码,其他开发人员可能无法阅读。我说,如果你选择一个给定的框架,你也可以遵循它的约定。可能需要在调用
$product->associate();
之前保存品牌。刚刚注意到在你的帖子中,你说你“认为品牌模型只应该有一个受保护的$table=“brands”
行”,但据我所知不是这样。我非常确定该模型必须有一个公共功能产品(){返回$this->belongsTo('Product');}
method,这样调用associate()$products模型上的可以填写品牌
模型上的产品id
字段。我不是100%支持有一个
,但是有很多
肯定是这样的,这是一种与关系相反的东西(即模型有一个外来id
列)