繁体   English   中英

Larave BelongsTo 关系返回 null

[英]Larave BelongsTo relationship returns null

我有两个 Eloquent 型号:

1)项目:

class Project extends Model
{
    protected $table = 'projects';
    protected $fillable = ['id', 'user_id', 'account_id'];

    public function user(){
        return $this->belongsTo(User::class);
    }

    public function account()
    {
        return $this->belongsTo(Account::class, "account_id");
    }

2) 账户:

class Account extends Model
{
    // ...

    public function projects(){
        return $this->hasMany(Project::class);
    }

目标是返回项目的帐户:

Project::with("account")->get()->pluck("account");

结果:

null

那么每个项目都有一个帐户,当你这样做时

Project::with('account')->get()这意味着您将使用他们的帐户获得项目,并且某些项目可能还没有帐户在这种情况下,当您尝试获得帐户时,您将获得 null

$projects = Project::with('account')->get();

$projects->first()->account (这里你不确定 account 是否存在)

Project::whereHas('account')->get()这个只会得到拥有账户的项目

你写的这行代码, Project::with("account")->get()->pluck("account");

当您运行它时,如果您有多个项目使用他们的帐户并且有些没有帐户,您的结果将是这样的

App\Account..
App\Account..
null
null
App\Account..

如果您喜欢使用您的代码,您需要使用集合过滤器进行过滤,然后提取帐户以跳过 null 帐户(不推荐)

Project::with("account")
  ->get()
  ->filter(fn($project) => $project->account);
  ->pluck("account");

你不能做这样的事情:

$projects = Project::all();

$projects->each(function($project) {
  echo $project->account
})

你为什么不用这个? 您的查询没有任何条件,所以直接获取所有账户

Account::all();

如果你有条件,你可以使用它;

Account::whereHas('projects', function($query){
    $query->where('user_id', 1); //projects' user_id
})->get();

暂无
暂无

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

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