Laravel/Ardent - 在 save() 上,错误:关系方法必须返回 Illuminate 类型的对象

Posted

技术标签:

【中文标题】Laravel/Ardent - 在 save() 上,错误:关系方法必须返回 Illuminate 类型的对象【英文标题】:Laravel/Ardent - on save(), error: Relationship method must return an object of type Illuminate 【发布时间】:2015-02-26 22:09:30 【问题描述】:

我在解决我的 Laravel 关系时遇到了一些麻烦。在我的应用程序中,用户和想法之间存在一对多的关系。 (用户可能有多种想法。)我正在使用 Ardent。

这是我的用户模型:

使用 Illuminate\Auth\UserTrait; 使用 Illuminate\Auth\UserInterface; 使用 Illuminate\Auth\Reminders\RemindableTrait; 使用 Illuminate\Auth\Reminders\RemindableInterface; 使用 LaravelBook\Ardent\Ardent; 类用户扩展热心实现 UserInterface,RemindableInterface 使用 UserTrait、RemindableTrait; /** * 模型使用的数据库表。 * * @var 字符串 */ 受保护的 $table = '用户'; /** * 从模型的 JSON 表单中排除的属性。 * * @var 数组 */ protected $hidden = array('password', 'remember_token'); protected $fillable = array('first_name', 'last_name', 'email', 'password'); 公共 $validation_errors; 公共 $autoPurgeRedundantAttributes = true; 公共 $autoHashPasswordAttributes = true; 公共 $autoHydrateEntityFromInput = true; public static $passwordAttributes = array('password'); 公共静态 $rules = 数组( 'first_name' => '必需|介于:1,16', 'last_name' => '必需|介于:1,16', '电子邮件' => '必需|电子邮件|唯一:用户', '密码' => '必需|介于:6,100' ); 公共职能理念() 返回 $this->hasMany('Idea');

这是我的想法模型:

使用 LaravelBook\Ardent\Ardent; 类理念扩展热心 /** * 模型使用的数据库表。 * * @var 字符串 */ 受保护的 $table = '想法'; 受保护的 $fillable = array('title'); 公共 $validation_errors; 公共 $autoPurgeRedundantAttributes = true; 公共 $autoHydrateEntityFromInput = true; 公共静态 $rules = 数组( '标题' => '必需' ); 公共功能用户() 返回 $this->belongsTo('User');

最后,这是我的控制器代码:

类 IdeasController 扩展 BaseController 公共函数 postInsert() $idea = 新想法; $idea->user()->associate(Auth::user()); 如果($idea->保存()) 返回响应::json(数组( '成功' => 真, 'idea_id' => $idea->id, 'title' => $idea->title), 200 ); 别的 返回响应::json(数组( '成功' => 假, '错误' => json_encode($idea->errors)), 400 );

$idea->save() 抛出错误:


  "error": 
    "type": "LogicException",
    "message": "Relationship method must return an object of type Illuminate\\Database\\Eloquent\\Relations\\Relation",
    "file": "\/var\/www\/3os\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Eloquent\/Model.php",
    "line": 2498
  

起初,我试图在 Idea 中设置 user_id,如下所示:

$idea->user_id = Auth::id();

然后我将其更改为:

$idea->user()->associate(Auth::user());

但结果是一样的。

任何建议将不胜感激。

【问题讨论】:

你想要的是将很多想法保存给用户吗? 在这种特定情况下,我想保存一个与用户相关联的想法。 【参考方案1】:

您不能在那个方向使用associate,因为它只能用于belongsTo 关系。在您的情况下,一个想法属于用户,而不是相反。

我怀疑保存时出现错误,因为您创建了一个没有所需标题的想法,然后您尝试通过调用 $idea->errors 来获取错误,而它应该是 $idea->errors()

【讨论】:

谢谢lowends。 Auth::id() 和 Auth::user()->id 似乎是一回事。为了验证,我打印了它们并且都打印了相同的用户 ID。感谢有关 Associate 的提示,但我还是迷路了! 太棒了!对不起,大雁追逐。你完全正确。【参考方案2】:

associate 将适用于 belognsTo 关系,在您的事业中,您必须使用附加相关模型。在documentation 中查看有关附加相关模式的更多信息。

【讨论】:

以上是关于Laravel/Ardent - 在 save() 上,错误:关系方法必须返回 Illuminate 类型的对象的主要内容,如果未能解决你的问题,请参考以下文章

-save-dev 在 npm install grunt --save-dev 中是啥意思

-save-dev 在 npm install grunt --save-dev 中是啥意思

在 model.save 或 model.save 中捕获数据库异常!方法?

canvas.save(Canvas.ALL_SAVE_FLAG)在android 9中不起作用

npm --save -D --save -dev

使用 --save 或 --save-dev 保存 npm @types 类型