php - Laravel hasOne 关系在 dd 上返回 null

标签 php mysql laravel relational-database

我会试着把这个问题写清楚,因为过去我没有收到任何有用的答案。人们似乎认为我的 Auth::user() 为空,或者我设置错误。我可以向您保证,情况并非如此。

我最近在 Laravel 5.3 中编写了一个应用程序,现在已经开始在 Laravel 5.4 上开始,我正在尝试让一个简单的 hasOne 关系起作用。

我有一个名为 srp_user_statistics 的表,它为表 users 中的每条记录保存一条记录,它保存该用户的统计信息。 users表的主键是idsrp_user_statistics表的主键是user_id

我正在尝试获取表 srp_user_statistics 中的用户记录,其中 user_id 等于表 users 中的列 id > 所以在这种情况下 Auth::user()->id

这种关系在 Laravel 5.3 中运行良好,但在 Laravel 5.4 中似乎不起作用。我将在下面列出我检查过的内容,以避免人们假设我之前在其他论坛网站上提出的问题。

Auth::user() 不为空,它有 44 个属性:
dd(Auth::user());

我怎么知道关系是空的?我如何检查它?
所以一开始,我通过尝试在 Blade View home.blade.php< 中使用 {{ Auth::user()->roleplay->user_id }} 打印列来检查它 执行此操作时,我收到了 laravel 的错误页面,指出 Trying to get property of non-object

你怎么知道不仅仅是那个专栏?
我执行了 dd(Auth::user()->roleplay) 并返回了 null


这是我的 Player.php,控制表 user

的类
<?php
namespace App\Database\Frontend\User;

use Hash;
use Eloquent;
use \Illuminate\Auth\Authenticatable;
use \Illuminate\Contracts\Auth\Authenticatable as Authentication;

class Player extends Eloquent implements Authentication
{
    use Authenticatable;

    protected $primaryKey   = 'id';
    protected $table        = 'users';
    public $timestamps      = false;
    protected $fillable     = [];

    public function setPasswordAttribute($value)
    {
        $this->attributes['password'] = Hash::make($value);
    }

    public function setUsernameAttribute($value)
    {
        return $this->attributes['username'] = $value;
    }

    public function roleplay()
    {
        return $this->hasOne('App\Database\Frontend\User\Roleplay', 'user_id');
    }
}


这是我的 Roleplay.php,控制表 srp_user_statistics

的类
<?php
namespace App\Database\Frontend\User;

use Eloquent;

class Roleplay extends Eloquent
{
    protected $primaryKey   = 'user_id';
    protected $table        = 'srp_user_statistics';
    public $timestamps      = true;
    protected $guarded = ['user_id'];

    public function user()
    {
        return $this->belongsTo('App\Database\Frontend\User\Player', 'user_id', 'id');
    }

    public function government_role()
    {
        return $this->belongsTo('App\Database\Frontend\Roleplay\GovernmentRole', 'government_id');
    }
}

这是显示 Trying to get property of non-object 时的错误日志

in HomeController.php line 16
at HandleExceptions->handleError(8, 'Trying to get property of non-object', 'C:\\rcms_r\\app\\Http\\Controllers\\Frontend\\User\\HomeController.php', 16, array()) in HomeController.php line 16
at HomeController->getView()
at call_user_func_array(array(object(HomeController), 'getView'), array()) in Controller.php line 55
at Controller->callAction('getView', array()) in ControllerDispatcher.php line 44
at ControllerDispatcher->dispatch(object(Route), object(HomeController), 'getView') in Route.php line 203
at Route->runController() in Route.php line 160
at Route->run() in Router.php line 559
at Router->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 30
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in SubstituteBindings.php line 41
at SubstituteBindings->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Authenticate.php line 43
at Authenticate->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in VerifyCsrfToken.php line 65
at VerifyCsrfToken->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in ShareErrorsFromSession.php line 49
at ShareErrorsFromSession->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in StartSession.php line 64
at StartSession->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 37
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in EncryptCookies.php line 59
at EncryptCookies->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Router.php line 561
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 520
at Router->dispatchToRoute(object(Request)) in Router.php line 498
at Router->dispatch(object(Request)) in Kernel.php line 174
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request)) in Pipeline.php line 30
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in TransformsRequest.php line 30
at TransformsRequest->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in TransformsRequest.php line 30
at TransformsRequest->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in ValidatePostSize.php line 27
at ValidatePostSize->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 46
at CheckForMaintenanceMode->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Kernel.php line 149
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 116
at Kernel->handle(object(Request)) in index.php line 53


我还尝试了什么?
我试过更改关系参数,删除、添加和修改它们,但似乎没有任何方法可以使这种关系起作用。

最佳答案

在这种情况下,关系应该这样定义:

public function roleplay()
{
    return $this->hasOne('App\Database\Frontend\User\Roleplay', 'user_id', 'id');
}

role_id 更改为您在 players 表中使用的外键的实际名称。

Eloquent determines the foreign key of the relationship based on the model name. In this case, the Phone model is automatically assumed to have a user_id foreign key. If you wish to override this convention, you may pass a second argument to the hasOne method.

Additionally, Eloquent assumes that the foreign key should have a value matching the id (or the custom $primaryKey) column of the parent. In other words, Eloquent will look for the value of the user's id column in the user_id column of the Phone record. If you would like the relationship to use a value other than id, you may pass a third argument to the hasOne method specifying your custom key.

https://laravel.com/docs/5.4/eloquent-relationships#one-to-one

关于php - Laravel hasOne 关系在 dd 上返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43048838/

相关文章:

mysql - 将 MSAccess 项目管理应用程序转换为 PHP/MySQL : Which Methodology?

MySQL 从满足条件的行中选择字段,并从上面的行中选择字段

laravel - 如何使用补丁方法更新laravel 5.2用户编辑表单

php - Codeigniter View -插入语句

php - 如何在 jQuery 中从 PHP 获取数组键

php - 在 php 中使用 wkhtmltoimage

MySQL 按连续行分组

php - Laravel .env 文件返回错误数据

laravel - 如何在 Laravel 中返​​回复制的数据而不是 bool 值

PHP如何检测变量的变化?