【问题标题】:Eloquent relations - add (but don't save) to belongsToMany雄辩的关系 - 添加(但不保存)到 belongsToMany
【发布时间】:2017-05-09 13:04:26
【问题描述】:

我想创建一个 Eloquent 模型,而不是立即将它保存到数据库中。但是,我希望包含所有关系,以便通过单个“push()”调用我可以保存整个结构。

下面的示例显示了我想要做的事情。我建立了以下关系:

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

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

很标准,一个帖子可以有很多标签,一个标签可以属于很多帖子。

我知道我现在可以简单地做到这一点:

//save the post
$post = new Post;
$post->save();

//assign the tag
$post->tags()->save($tag);

但是,我真正想要的是:

//create the post
$post = new Post;

//assign the tag (without saving anything yet!)
$post->tags()->add($tag);

//save the whole thing
$post->push();

相关文档是 here,但似乎没有在 belongsToMany 上提到“添加”而不是“保存”。

任何帮助表示赞赏。

【问题讨论】:

  • 我认为这是不可能的。帖子和标签是这样关联的,如果我没记错的话,标签有post_id,只有在保存帖子时才会生成id,然后才能将标签与帖子相关。
  • 当然 - 实际上 post_id 和 tag_id 都将在 post_tag 表中,但要点。我仍然认为这是可能的。从实现的角度来看,我想它需要在枢轴之前简单地创建父母。所以当然有可能——但目前可能还没有实现。
  • 如果您有这样的数据透视表并且使用其他一些标识符作为外键而不是使用生成的 id,这似乎是可能的。有了它,您可以先保存数据透视表,然后保存帖子和相关标签。
  • 所以我听到的是,正如我所怀疑的,laravel 目前没有这样做的功能?我需要编写一个自定义保存函数来按正确的顺序执行此操作吗?
  • 你也许可以用 Laravel 的方式做到这一点,我对 laravel 的经验并不多,但应该有出路。

标签: laravel laravel-5 eloquent


【解决方案1】:

这其实很简单,只要你明白什么

$post->tags()->add($tag);

确实如此。这将访问标签关系 ala 查询构建器,但您要做的只是将标签添加到您的帖子中。

Laravel 没有内置的方法来处理这个问题,但你可以像这样轻松地处理它:

见下文

$post->addTag($tag); // Adding a tag to our tag array


protected $attributes = [
   'tags' => [],    
];

//type hint a tag and push the tag into our tags attribute
public function addTag(Tag $tag) { 
   array_push($this->attributes['tags'], $tag);
}


//Iterate over the tags and attach them to our Post model, 
also save the post model after.

public function push() {
  return collect($this->attributes['tags'])->each(function($tag){
     $this->attach($tag);
  });
  $this->save();
}

我还没有测试过代码,但希望这能让你走上正确的道路。我也很想知道你为什么发现自己在推动这个实现?我以前没有找到类似的用例,也许可以帮助您找到一种更标准化的方式来处理您的用例。

【讨论】:

  • 感谢您的回答。也许您是对的,这不是标准方法。这个想法不仅是在实现控制器时处理基本的 CRUD 方法,而且在内部将所有内容转换为标准模型。然后可以保存它,执行一些操作,丢弃,或者甚至直接在视图上使用它而不保存任何东西。如果我确实想存储,我可以简单地将整个模型推送到数据库。更标准的方法是什么?
  • 我明白了,所以在上面的例子中——你将传递一个预先填充的非持久化 Post 对象。对于这样的事情,我倾向于在前端坚持一切或使用状态持久模式(参见 vuex.vuejs.org),然后如果用户想要“推送”他们只需将 Post 对象从前端扔到 API ,这与您在这里没有前端框架的情况下所做的想法相似。也许您正处于需要从 Web 堆栈中获得更多内容的地方?当在前端更容易维护时,似乎为此使用 Laravel 有点过头了。只是思考的食物
  • 实际上帖子和标签示例根本不在我的应用程序中。这只是为了展示我正在尝试做的事情。简而言之,我认为 Eloquent 模型不仅仅是一种持久化数据的方式,还可以在需要时轻松存储。正如您在回答中所说,我相信通过对模型进行一些定制,仍然很有可能,我只需要稍微定制每个类来处理枢轴。但是你让我考虑是否所有必要,所以谢谢你!
  • 加载已保存的模型及其关系时如何工作? (您的 _attributes 不会被填充)我需要做一些类似的事情来处理对象的一次性配置或对象的“保存”配置。我在想我可以重写 save() 来处理你的 _attributes[] 临时存储关系的方法,但是当它从数据库加载时你如何填充 _attributes[] 呢?或者我应该只创建一个访问器,在返回我的关系时检查两者?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 2015-09-27
  • 1970-01-01
  • 2019-02-20
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多