Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model laravel:向数据库插入数据的有力示例_Model_Insert_Laravel_Primary Key_Eloquent - Fatal编程技术网

Model laravel:向数据库插入数据的有力示例

Model laravel:向数据库插入数据的有力示例,model,insert,laravel,primary-key,eloquent,Model,Insert,Laravel,Primary Key,Eloquent,我很抱歉问这个问题,但我来自codeIgniter,很难理解雄辩的模型插入。对我来说,这是一种处理模型的新方法 我现在已经阅读并理解了一些基础知识 我有下面的例子。我有一个产品,它有很多属性,但相关的是品牌和产品名称。(请参见以下示例表) 产品:标识(PK)、名称、说明、品牌标识 品牌:id(PK),名称 现在问题来了。我知道我可以创造一个新品牌,我知道如何创造一个新产品。然而,我不知道如何将两者连接在一起。这是我现在掌握的一些代码。我想创建一个新产品并自动填充品牌表。这是控制器现在的一部分 简

我很抱歉问这个问题,但我来自codeIgniter,很难理解雄辩的模型插入。对我来说,这是一种处理模型的新方法

我现在已经阅读并理解了一些基础知识

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

产品:标识(PK)、名称、说明、品牌标识 品牌:id(PK),名称

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

简而言之。我想要产品内的brands.id.brand\u id

    $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
  • 型号名称为单数且为StudlyCase(因此表
    产品
    ,表
    品牌
  • 只要遵循Laravel约定,就不必指定
    $table
    属性(即,table name是模型类名的复数蛇形版本)
  • 您应该以两种方式定义关系(每个模型中有一个,
    belongsTo
    ,相反的是
    hasMany
    ,还有对
    hasOne
    /
    belongsTo
    belongsToMany
    /
    belongsToMany
  • 检索关系的方法的名称是合理的-如果您期望一个结果,则将其设置为单数(
    品牌
    产品
    中),如果您期望多个结果,则将其设置为复数(
    产品
    品牌
    中)
  • 在关系定义中使用模型类名(
    $this->hasMany('Brand')
    而不是
    $this->hasMany('brands')
    或任何其他变体
  • 如果您坚持这些规则,您的模型可以非常简洁,但功能非常强大

    现在,关于如何实际定义真实数据,我感觉您发布的代码可能工作得很好(这实际上取决于Laravel在幕后有多聪明),但正如我在第一条评论中所建议的,我会确保在调用
    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
    列)