将数据插入到 laravel 中的数据透视表

2022-08-31 00:55:48

我有3张桌子:,,。poststagspost_tag

每个都有许多标签,所以我对它们使用方法。但是,当我在下拉列表中选择例如3个标签时,我无法将它们添加到其中,因此我无法选择并显示每个帖子的标签。PosthasManypost_tag

我的型号:Post

 class Post extends Eloquent{
 public function tag()
         {
           return  $this->hasMany('Tag');
         }
    }

我的型号:Tag

class Tag extends Eloquent{
 public function post()
         {
           return  $this->belongsToMany('Post');
         }

}

和我的 :postController

class postController extends BaseController{

public function addPost(){

    $post=new Post;

    $post_title=Input::get('post_title');
    $post_content=Input::get('post_content');
    $tag_id=Input::get('tag');

    $post->tag()->sync($tag_id);
    $post->save();

我希望将此保存保存及其标签ID保存到表中,但它不起作用。感谢您抽出宝贵时间接受采访。post_idpost_tag


答案 1

你有一个基本的想法是正确的,但是你的代码存在一些问题。有些正在阻止它工作,有些只是常规问题。

首先,这是一个关系(你有一个数据透视表),所以你必须将关系的两边都定义为(即使你对关系的一方或双方的看法也是如此)。这是因为Laravel期望具有两种不同关系类型的某种数据库结构。belongsTomanybelongsToManyhasMany

另一个问题(您发现自己发现)是您将标签添加到关系中(通过您实际保存帖子之前)。您必须首先保存帖子(以便 laravel 知道要添加到数据透视表的 ID),然后添加关系。如果您担心标签部分失败,然后数据库不一致,则应使用事务。->tag()->sync()post_id

最后,您遇到的“约定”错误是,根据定义,属于多元关系涉及结果集合。因此,并且应该分别是。tagposttagsposts

所以这是我重写的代码版本:

class Post extends Eloquent
{
    public function tags()
    {
        return $this->belongsToMany('Tag');
    }
}

class Tag extends Eloquent
{
    public function posts()
    {
        return $this->belongsToMany('Post');
    }
}

class PostController extends BaseController
{
    public function addPost()
    {
        // assume it won't work
        $success = false;

        DB::beginTransaction();

        try {
            $post = new Post;

            // maybe some validation here...

            $post->title = Input::get('post_title');
            $post->content = Input::get('post_content');

            if ($post->save()) {
                $tag_ids = Input::get('tags');
                $post->tags()->sync($tag_ids);
                $success = true;
            }
        } catch (\Exception $e) {
            // maybe log this exception, but basically it's just here so we can rollback if we get a surprise
        }

        if ($success) {
            DB::commit();
            return Redirect::back()->withSuccessMessage('Post saved');
        } else {
            DB::rollback();
            return Redirect::back()->withErrorMessage('Something went wrong');
        }
    }
}

现在,许多控制器代码都围绕着交易内容 - 如果你不太关心这一点,那么你就可以删除它。此外,有几种方法可以完成交易工作 - 我已经使用了一种不理想的方法,但只需最少的代码即可表达观点。


答案 2

要将数据插入到数据透视表名称diplome_user,只需按照我的示例操作:我的数据透视表如下所示:

enter image description here

//this is Diplome Model

    class Diplome extends Model
    {
    public function users()
        {
            return $this->belongsToMany('App\User','diplome_user')->withPivot('etablissement', 'annee', 'mention');;
        }
    }

现在在你的里面我的DiplomeController,我可以做这个查询:

$user = Auth::user(); 

因为我需要一个用户,所以我只取连接的一个,之后,我创建了一个Diplome实例,就像:

$diplome = new Diplome();
$diplome->libelle = "the name";
$diplome->decription= "description of the ...";
$diplome->save();

现在最重要的一步是:

   $diplome->users()->attach($user, ['etablissement'=> 'bib',
                                            'annee'=>'2015',
                                            'mention'=>'AB',
                                            ]);

结果如下:

enter image description here


推荐