【问题标题】:Laravel hasOne relationship returning null on ddLaravel hasOne 关系在 dd 上返回 null
【发布时间】:2017-03-27 22:32:59
【问题描述】:

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

我最近在 Laravel 5.3 中编写了一个应用程序,现在开始使用 Laravel 5.4,我正在尝试建立一个简单的 hasOne 关系来工作。

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

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

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

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

我如何知道关系为空?我如何检查它?
因此,首先,我尝试在刀片视图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


我还尝试了什么?
我已经尝试更改关系参数,删除、添加和修改它们,但似乎没有什么能让这种关系起作用。

【问题讨论】:

  • 好的,你确定有一个角色扮演连接到数据库中插入的用户吗? $r = Roleplay::where('user_id', Auth::user()-&gt;id)-&gt;first() 的结果是什么?
  • 该代码返回一整行以及该记录的数据,我对内容做了一个要点,因为这里发布的内容太多了。gist.github.com/Seriosk/0ccec7a3930ed72077b7e39cfa706df4
  • 是的,看起来不错。必须与你的关系有关。
  • 好吧,我想再尝试一件事来进一步调试它。试试这个\DB::enableQueryLog(); $rp = Auth::user()-&gt;rolaplay; dd(\DB::getQueryLog());。这应该会转储所有执行的查询(在本例中为关系查询)。
  • 谢谢,我很感激,我只是希望这是一个答案,所以我可以接受它。

标签: php mysql laravel relational-database


【解决方案1】:

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

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

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

Eloquent 根据模型名称确定关系的外键。在这种情况下,电话模型被自动假定为具有 user_id 外键。如果您希望覆盖此约定,您可以将第二个参数传递给 hasOne 方法。

此外,Eloquent 假设外键的值应该与父级的 id(或自定义的 $primaryKey)列匹配。换句话说,Eloquent 会在 Phone 记录的 user_id 列中查找用户 id 列的值。如果您希望关系使用 id 以外的值,您可以将第三个参数传递给 hasOne 方法,指定您的自定义键。

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

【讨论】:

  • 我将我在“播放器”类中的关系更改为您输入的内容,将role_id 替换为id(表users 的标识符),但它没有改变任何东西。我仍然返回一个空数组。
  • column id 是我用来识别users 表中的记录的,这不是我应该放置的列吗?这是我的用户表中唯一代表记录标识符的列。如果您详细介绍一下会有所帮助。
  • dd(Auth::user()-&gt;roleplay); 仍然返回 null,即使使用更新的代码。
猜你喜欢
  • 2016-02-29
  • 2020-05-16
  • 1970-01-01
  • 2014-08-21
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多