【问题标题】:Set hasOne relation to new instance of child model设置与子模型的新实例的 hasOne 关系
【发布时间】:2017-09-10 23:42:06
【问题描述】:

使用 Laravel 4.2,如何在不接触数据库的情况下将模型上的 hasOne 关系设置为新模型的实例?

我想做以下事情,但 Laravel 将实例视为属性,而不是子关系。

class ParentClass extends \Eloquent {
  public function child() {
    return $this-hasOne('ChildClass', 'child_id', 'parent_id');
  }
}

$parent = new ParentClass();
$parent->child = new ChildClass();

【问题讨论】:

  • 我已经有一段时间没有使用 laravel 了,但你能做到$parent = new ParentClass(); $parent->child()->create();吗?实际上,我现在没有安装来测试它,但$parent->child() = new ChildClass(); 也可以工作。您可能只是缺少括号。
  • 感谢您的回复。 ->create() 想要保存到数据库。 ->child() 抛出错误'Can't use method return value in write context'。
  • 好的,这个怎么样:$child = new ChildClass(); $parent->child()->attach($child->id);
  • ->attach 是 BelongsToMany 的一部分,而不是 hasOne,所以很遗憾这不起作用。
  • 对不起,你是对的。多读几遍后,似乎 eloquent 并不完全支持您尝试做的事情。尽管取决于您要做什么,但您可能能够足够接近。首先,如果您查看略低于此锚点 (laravel.com/docs/5.4/eloquent-relationships#the-save-method) 的文档,它们描述了 associate 方法,该方法可用于将孩子与父母联系起来(尽管听起来您正在尝试另一种方式周围)。

标签: laravel laravel-4


【解决方案1】:

为了解决我的问题,我创建了一个 Trait 类,我将其添加到我的模型中,它允许我设置关系。这样做不会自动设置我的父/子关系值,因此我必须小心在保存/推送之前手动执行此操作。

trait ModelSetRelationTrait
{
  public function setRelation($key, $model)
  {
    $this->relations[$key] = $model;
  }
}

class ParentClass extends \Eloquent {
  use ModelSetRelationTrait;
  public function child() {
    return $this-hasOne('ChildClass', 'child_id', 'parent_id');
  }
}

【讨论】:

    猜你喜欢
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多