【问题标题】:Integrity constraint violation: 1048 Column 'taggable_id' cannot be null完整性约束违规:1048 列 'taggable_id' 不能为空
【发布时间】:2016-09-05 02:19:33
【问题描述】:

我正在尝试设置laravel-tagging,这似乎是 Laravel 最流行的标记系统。但不幸的是,它没有任何前端功能。我彻底遵循了guide。最后,我在尝试创建标签时遇到了错误:

SQLSTATE[23000]:违反完整性约束:1048 列 'taggable_id' 不能为空(SQL:插入tagging_taggedtag_nametag_slugtaggable_typetaggable_id)值 (奶酪,奶酪,App\Links,))

我发现其他几个帖子中人们遇到了类似的错误,例如thisthisthis。但它们都没有提供明确的解决方案。人们和常识都说应该保存包含taggable_id 的模型,以便将标签存储在数据库中。我的控制器代码如下所示:

public function storeStuff(Request $request)
{
    // Create the link first
    $link = new Links;

    // Now add tags
    $link->tag(explode(',', $request->tags));

    // Try to save tags?
    $link->save();
}

在我的情况下,我尝试使用 $link->save(); 保存它不起作用。我仍然得到同样的错误,我的数据库表tagging_tagged,其中包含taggable_id 列仍然充满了空值。有人对如何解决这个问题有任何建议吗?

编辑:按照 Tobias Karlsson 的建议,我通过添加另一个保存来让它工作:

    $link = new Links;
    $link->tag_name = $request->tags;
    $link->save();

    // Now add tags
    $link->tag(explode(',', $request->tags));

    $link->save();

我还必须添加时间戳来修复丢失的created_at 错误。时间戳不包含在 laravel-tagging 包附带的初始迁移中,即使我不确定它们是否对标签有用。我的tagging_tagged 表现在看起来像这样:

FIELD         TYPE              NULL   KEY
id            int(10)unsigned   NO     PRI      auto_increment
taggable_id   int(10)unsigned   NO     MUL      
taggable_type varchar(255)      NO     MUL      
tag_name      varchar(255)      NO          
tag_slug      varchar(255)      NO     MUL      
created_at    timestamp         YES         
updated_at    timestamp         YES         

我仍在尝试让 Javascript 自动填充标签。一旦一切正常,我会更新这个问题。

【问题讨论】:

  • 我认为taggable_id 是外键,您不能输入相同的NULL 数据。因此,要么删除约束,要么为该列添加一些值。
  • taggable_id 是主键吗?您能否粘贴以下 SQL 查询的输出:DESCRIBE tagging_tagged
  • 基本上你正在尝试标记一个还没有id 的资源。您必须先保存它,以获得 id,然后尝试添加标签。

标签: php mysql laravel


【解决方案1】:

你必须在表结构中为 taggable_id 设置DEFAULT NULL,否则你必须像这样在查询中添加 NULL。

insert into tagging_tagged (tag_name, tag_slug, taggable_type, taggable_id) values (Cheese, cheese, App\Links, NULL)

【讨论】:

    【解决方案2】:

    您必须先保存模型,然后设置标签,然后再次保存。

    $link = new Links;
    $link->someProperty = $request->someProperty;
    
    // Save model to get a taggable_id (model id).
    $link->save();
    
    // Now add tags
    $link->tag(explode(',', $request->tags));
    
    // Save tags.
    $link->save();
    

    【讨论】:

      【解决方案3】:

      这可能来晚了,但应该有助于其他尝试在其工作中实施标记的人。如果您已经了解Laravel-tags,那么您可能会发现他们的解释存在差距,以及他们如何让像我这样的外行更难理解他们的包裹。以 Tobias Karlsson(上图)为例进行修改。

      $link = new Links;
      
      //you shouldn't add any tag property in the line below
      $link->someProperties = $request->someProperties;
      
      //save model to get taggable_id (model_id)
      $link->save();
      
      //now add tags
      $link->attachTags(['tag1','tag2','tag3']);
      $link->save();
      

      【讨论】:

        猜你喜欢
        • 2016-11-07
        • 1970-01-01
        • 2018-05-01
        • 2021-09-25
        • 2020-03-29
        • 2018-03-04
        • 2018-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多