【问题标题】:Laravel Eloquent creating categories for postsLaravel Eloquent 为帖子创建类别
【发布时间】:2014-08-30 10:41:39
【问题描述】:

我有 3 个表帖子、类别和 post_category。该帖子有 2 个类别,例如书籍 (1) 和杂志 (2)。我创建帖子并选择两个类别的书籍和杂志我想保存 post_id 以及 post_category 表中的 categories_id 如何在不同的行中插入两个类别以及如何在提交时获取帖子的 id?顺便说一句,我尝试在 post 表中添加 category_id 作为数组,但我很难查询该类别的单个 id。

【问题讨论】:

  • 您是否在PostCategory 模型上设置了关系?两者都是belongsToMany 提供的表名,因为它不遵循约定(category_post - 字母顺序,单数)
  • 您的 PostCategoryTable 图片中似乎有一个小错字,因为第一列中的 id 不应该是两行中的 1,而是 1 和 2。
  • 是的,很抱歉它应该是 2 而不是 1

标签: php mysql laravel eloquent


【解决方案1】:
$post = new Post();
$post->title = 'Hello new post';
$post->save();
$category_ids = $input['category_id']; //html name in array 
$post_cat_data = array();
foreach($category_ids as $index => $value) {
    if (!empty($value)) {           
        $post_cat_data[] = [            
        'category_id' => $value,            
       ];
    }       
 }                  
$post->post_category()->createMany($post_cat_data);

【讨论】:

    【解决方案2】:

    如果您使用 Eloquent 并且已正确设置模型上的关系,则可以对模型关系 to insert new records on the pivot table 使用 attach() 方法。

    $post = Post::create(['title' => 'Hello Second World']);
    $post->categories()->attach([1,2]); // Attaching Category IDs to pivot table
    echo $post->id; // Getting the ID
    

    跟进:

    attach() 方法只会根据传递的参数在数据透视表上创建新记录,不会创建相关模型的新实例

    要实现这一点,您需要将模型传递给关系上的save() 方法:

    $post = Post::create(['title' => 'Hello World']);
    $post->categories()->save(Category::create(['category' => 'Leaflets']));
    

    感谢 deczo 澄清这一点

    【讨论】:

    • 任何cmets为什么这个被否决?我多次阅读了这个问题,实际上我认为我理解正确。
    • SE 应该提供查看谁投反对票或赞成票的选项,任何人都知道如何查看
    • 可能是因为附加不会保存新实例化的模型,但你永远不知道.. 但是你的代码是 OP 需要的,所以这是我的 +。我建议只添加 create 已经保存的帖子,然后在关系上调用 attach
    • @deczo Probably because attach won't save a newly instantiated Model 你介意向我解释一下吗? :) attach() 将根据传递的参数插入新记录。为什么需要保存模型,或者你在这里的意思是什么?谢谢你的提示,我会添加它的
    • 你链接了insert a related modelattach 不能做什么。它要求相关模型“存在”,即。之前得救。含义:$model = new Model([..]); $parent->relation()->attach($model); 不起作用,但 $parent->relation()->save($model) 会。
    【解决方案3】:

    使用插入命令

    $param = array(
            array('post_id' => '1', 'category_id' => 1),
            array('post_id' => '1', 'category_id' => 2),
    );
    
    DB::table('post')->insertGetId($param);
    

    注意!它忽略时间戳

    LINK HERE

    【讨论】:

    • 您的代码是通过查询生成器,而不是 Eloquent ;-)
    • 你在写@trizz ... :) ... 所以?
    • 如果我只选择了 1 个类别会怎样?
    • 你应该建立一个数组并作为参数传递给 insertGetId 函数
    • 这绝对是错误的。它是关于插入数据透视表,而不是帖子,即便如此,这也远非简单的解决方案。
    猜你喜欢
    • 2016-03-12
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多