我有三张桌子:poststagspost_tag.

Post个都有很多标签,所以我使用hasMany方法.但当我在下拉列表中 Select 例如3个标签时,我无法将它们添加到post_tag,因此我无法 Select 并显示每个帖子的标签.

我的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();

我希望将这个post_id save to post_tag表与其标记ID一起保存,

推荐答案

你有一个基本的 idea ,但是你的代码有一些问题.有些正在阻止它工作,有些只是常规问题.

首先,这是一个belongsTomany关系(你有一个数据透视表),所以你必须将关系的两面都定义为belongsToMany(即使hasMany是你对其中一方或双方的看法).这是因为Laravel希望使用两种不同关系类型的特定数据库 struct .

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

最后,您的"约定"错误是,根据定义,一个关系属于许多关系,涉及结果的集合.因此,tagpost应分别为tagsposts.

这是我重写的代码版本:

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

现在,很多控制器代码都围绕着事务的东西——如果你不太在意这一点,那么你最好删除它.还有几种方法可以实现事务处理——我 Select 了一种不太理想的方法,但只需少量代码就可以实现这一点.

Laravel相关问答推荐

在没有lang/*.json文件的情况下在Laravel项目中实现多语言支持

laravel vue 惯性分页器删除上一个和下一个链接

无法在 Laravel 项目中安装 @vitejs/plugin-vue

Laravel:BelongstoMany 关系实现

如何获得每种类型的总和

在 laravel 项目中放置 css 文件的位置

Laravel Blade - 产生内部部分

Laravel 重定向数据不工作

Laravel Auth::attempt() 返回 false

将 Laravel MYSQL 更改为 utf8mb4 以在现有数据库中支持表情符号

Laravel 5.4 LengthAwarePaginator

带有消息...必须返回关系实例的 LogicException.

localhost 和stream_socket_enable_crypto():SSL 操作失败,代码为 1

将 hasOne 模型附加到另一个 Laravel/Eloquent 模型而不指定 id

设置 Laravel 5.4 以使用 React

laravel Blade中多选选项中的旧值

Laravel - 更新时禁用更新时间

日期验证 - 如何本地化/翻译字符串今天和明天

Laravel 接口

控制器中的laravel foreach循环