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

好的,到目前为止一切都很好。您会注意到各种约定:

    表名是复数形式(productsbrands) 外键使用单数 (brand_id) 模型名称是单数和StudlyCase(所以Product 用于表productsBrand 用于表brands) 只要遵循 Laravel 约定,就不必指定 $table 属性(即表名是模型类名的复数蛇形大小写版本 您应该以两种方式定义关系(每个模型中一个,belongsTo 的逆是 hasMany,还有一对 hasOne/belongsTobelongsToMany/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(),因为它会自动获取$brandid 值,将其放入$productbrand_id 字段中,然后保存$product

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

无论如何,希望这篇文章能解决您的代码中的大量问题。正如我上面所说,这些是约定,您可以违反它们,但要这样做,您必须开始添加额外的代码,这对于其他开发人员来说可能非常难以阅读。我说如果你选择一个给定的框架,你不妨遵循它的约定。

【讨论】:

不确定是谁投了反对票,但怎么会呢?我认为我的回答是经过深思熟虑的,并且回答了问题并建议对原始代码进行改进(因为它有点混乱,甚至可能没有按原样工作)。很高兴听到批评。 这正是我正在寻找的答案。它有效,也很重要:我得到了一个明确的命名约定示例。谢谢 完全没问题。如果您愿意,也可以免费免费投票以撤消投票的人的工作。 @alexrussell 这是一个很好的答案,但我需要你的帮助。我已经插入了new Brand,现在我必须插入与插入品牌相关的多个产品。实现这一目标的最佳方法是什么? @Tiger 我可以想象,假设你说的是你有一个已经存在的Brand 并且需要添加各种尚不存在的Products,你应该能够使用$brand->products()->createMany([])(见here for Laravel's implementation)。但是,如果您的问题不是这么简单,我建议您提出一个新问题。

以上是关于laravel:雄辩的例子将数据插入数据库的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 将数据插入数据库

Laravel 数据插入

Laravel雄辩删除

LARAVEL 5.5 - 使用 Eloquent 模型将数据从 FORM 插入数据库

Laravel 插入默认值而不是通过请求发送的数据

未使用 laravel 8 将数据插入数据库