【问题标题】:Can't get model relation in artisan custom command Laravel 5.4无法在工匠自定义命令 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)。尝试记录对象

标签: php laravel command laravel-artisan


【解决方案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 方法的更多信息:


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

【讨论】:

  • 如果我的回答有帮助,请将其标记为解决方案并投票。
猜你喜欢
  • 1970-01-01
  • 2019-09-19
  • 2018-02-16
  • 2014-03-26
  • 2019-05-20
  • 1970-01-01
  • 2017-10-25
  • 2020-07-09
  • 2014-08-30
相关资源
最近更新 更多