无法在工匠自定义命令 Laravel 5.4 中获取模型关系

Posted

技术标签:

【中文标题】无法在工匠自定义命令 Laravel 5.4 中获取模型关系【英文标题】:Can't get model relation in artisan custom command Laravel 5.4 【发布时间】:2017-08-03 20:34:49 【问题描述】:

我创建了一个工匠自定义命令,在 handle() 方法中我需要获取一些关于用户的信息。

当我跑步时:

handle() 
   $users = User::all();
   foreach($users as $user) 
      $this->line($user->name);
   

它有效,但我需要类似的东西:

handle() 
   $users = User::all();
   foreach($users as $user) 
      $this->line($user->summoner->summoner_id);
   

我得到了尝试获取非对象的属性。

如果我在控制器中运行上面相同的代码,它就可以正常工作。

有人有想法吗?

用户模型:

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable

    use Notifiable;

    protected $fillable = [
        'name', 'email', 'password',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    public function summoner() 
        return $this->hasOne('App\Summoner');
    

召唤师模型:

    <?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Summoner extends Model

    protected $table = 'summoners';
    public $timestamps = true;

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

【问题讨论】:

展示你的模型和关系。 好的,上面已经编辑了 尝试在日志中转储$users。看看你在变量中到底得到了什么。如果任何用户没有电话号码,也会发生这种情况 听起来好像所有的召唤师都有一个用户,但并不是所有的用户都有一个召唤师。在尝试打印之前验证 (if !empty($user-&gt;summoner)) 您将电话号码编辑为其他内容。 (召唤者->召唤者_id)。尝试记录对象 【参考方案1】:

正如上面@aynber 提到的,如果DB 字段user.summoner_id 可以设置为NULL,那么就有没有相关Summoner 的用户。

所以你可以使用 QueryBuilder 的whereHas 方法,它会检查关系summoner 是否存在:

$users = User::whereHas('summoner')->get();
foreach($users as $user) 
  $this->line($user->summoner->summoner_id);

或者您可以检查每个选定用户是否存在summoner 关系,但这种方法可能会从数据库中选择冗余数据(如果您需要所有具有非空summoner_id 字段的用户):

$users = User::all();
foreach($users as $user) 
    if(empty($user->summoner))
        continue;
    
    $this->line($user->summoner->summoner_id);  

您可以在此处找到有关whereHas 方法的更多信息:

Laravel 5.4,查询关系是否存在:https://laravel.com/docs/5.4/eloquent-relationships#querying-relationship-existence


唯一奇怪的是,正如您所说(如果我没听错的话),在非工匠“常规”控制器中,相同的代码执行时没有错误。可能,这只是一个巧合:可能是当您在非 CLI(命令行输入)控制器中检查代码时,所有用户都有一个召唤者。

【讨论】:

如果我的回答有帮助,请将其标记为解决方案并投票。

以上是关于无法在工匠自定义命令 Laravel 5.4 中获取模型关系的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自定义工匠命令从数据库中打印一行

无法执行 Laravel 工匠命令

无法在 Laravel Homestead 中运行工匠命令

无法执行Laravel工匠命令

Laravel工匠错误:processutils

无法从工匠命令 Laravel/Lumen 进行 Crypt::decrypt