繁体   English   中英

无法渴望在Laravel中加载一对一关系

[英]Can't eager-load a One-to-One relation in Laravel

在Laravel 5.2中,我试图通过以下代码渴望加载一个User及其Usersettings: App\\User::with('usersettings')->get() ,但是它失败了,我似乎无法找出原因。 这是给定的错误。

BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::usersettings()'

我已经阅读了laravel文档,并且看了很多Laracasts ,并且以前也能用 ,所以我觉得我缺少了一些很小的东西,也许很明显。

User.php

<?php

namespace App;

/* User with fields: id, email */
class User extends Illuminate\Database\Eloquent\Model {
    protected $table = 'users';

    public function usersettings() {
        return $this->hasOne("App\Usersettings", "userid");
    }
}

Usersettings.php

<?php

namespace App;

/* Settings with fields: id, userid, textcolor */
class Usersettings extends Illuminate\Database\Eloquent\Model {
    protected $table = 'usersettings';

    public function user() {
        return $this->belongsTo('App\User', 'userid');
    }
}

//编辑:我已经尝试过将s小写。 这种错别字可能是偷偷将其复制到SO,但是即使在修复它之后,错误仍然存​​在,并且仍然存在。

//编辑:

<?php

namespace App;

use App\UserSettings;

class User extends Illuminate\Database\Eloquent\Model {
    protected $table = 'users';

    public function settings() {
        return $this->hasOne(UserSettings::class, "userid");
    }
}

如果我运行php artisan tinker >>> App\\User::with('settings')->get() ,它可以按预期工作,但是在下面

<?php

namespace App;

use App\UserSettings;

class User extends Illuminate\Database\Eloquent\Model {
    protected $table = 'users';

    public function usersettings() {
        return $this->hasOne(UserSettings::class, "userid");
    }
}

当我运行php artisan tinker >>> App\\User::with('usersettings')->get()时,给出BadMethodCallException with message 'Call to undefined method Illuminate\\Database\\Query\\Builder::usersettings()' 同样,当我将方法重命名为abc并运行php artisan tinker >>> App\\User::with('abc')->get() (同样失败)

在用户模型上定义关系时输入错误:

public function usersettings() {
    return $this->hasOne("App\Usersettings", "userid");
}

我建议进行一些清理:将表命名为“ users”和“ user_settings”,将“ userid”字段重命名为“ user_id”,将“ Usersettings”模型重命名为“ UserSettings”。

这样,您就无需显式定义表名和外键,因为您遵循约定,Laravel可以“猜测”它们。

您也可以将关系“ usersettings()”重命名为“ settings()”,因为很明显它们是用户的设置。 然后,您可以像这样获取它:'User :: with('settings')-> get()'。

更改模型关系后,是否尝试运行composer dump-autoload

只是要确保您了解这一点: 实际上,您不需要在UserSettings模型中定义关系即可实现所需的功能,只需在User模型中定义关系即可。 这是因为您只需要在用户的上下文中获取设置,而不需要相反的方式。

用户模型的代码:

<?php

namespace App;

use App\UserSettings;

class User extends Illuminate\Database\Eloquent\Model {

    public function userSettings() {
        return $this->hasOne(UserSettings::class);
    }
}

UserSettings模型:确保它是驼峰式的,并且迁移中存在userid (在这种情况下,约定是user_id ,所以我将在迁移中重命名该列,因为Eloquent会自动将其选中,而您不会需要在用户模型的hasOne()定义中使用第二个参数)。 另外,如果可以,将表重命名为user_settings 这是另一种口才的惯例,那就是模型名称UserSettings将类名中间的驼峰大小写字母S转换为_ (事实上​​,如果您需要将表名声明为我们使用了user_settings名称)。

UserSettings模型的代码:

<?php

namespace App;

/* Settings with fields: id, userid, textcolor */
class UserSettings extends Illuminate\Database\Eloquent\Model {
    protected $table = 'user_settings';
}

现在,您应该可以执行以下操作。 请注意, with参数必须是User模型中的关系函数名称。

$usersThatHaveSettingsIncludedInTheResults = User::with('userSettings')->get();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM