【问题标题】:Laravel belongsTo relationship not returning valuesLaravel belongsTo 关系不返回值
【发布时间】:2020-10-15 16:07:32
【问题描述】:

我正在尝试运行 hasMany,但我真的不知道为什么我没有得到任何结果! 两个表:公司,工作订单,每个工作订单都有一个公司名称和地址,我想在 laravel 中使用 belongsTo 关系来获取

<?php
namespace App;

class Company extends Model
{
    protected $table      = 'company';
    protected $primaryKey = 'company_id';

    public function jobs() {
        return $this->hasMany('App\Joborder');
    }
}

我的工作订单页面

<?php
namespace App;

class Joborder extends Model
{
    protected $table      = "joborder";
    public    $primaryKey = "joborder_id";
    protected $dates      = [
        'start_date',
        'created_at',
        'updated_at'
    ];

    public function company() {
        return $this->belongsTo('App\Company');
    }
}
    

这是页面控制器:

public function joblist() {
    $joblist     = Joborder::all();
    $newInstance = new Joborder;
    $company     = $newInstance->company();

    dd($company->name);
    dd($joblist);

    return view('pages.joblist')->with('jobs',$joblist);
} 

这是我运行后页面中的 dd

BelongsTo {#217 ▼
  #foreignKey: "company_id"
  #otherKey: "company_id"
  #relation: "company"
  #query: Builder {#218 ▶}
  #parent: Joborder {#205 ▼
    #table: "joborder"
    +primaryKey: "joborder_id"
    #dates: array:3 [▼
      0 => "start_date"
      1 => "created_at"
      2 => "updated_at"
    ]
    #guarded: array:1 [▼
      0 => "id"
    ]
    #fillable: []
    #connection: null
    #keyType: "int"
    #perPage: 15
    +incrementing: true
    +timestamps: true
    #attributes: []
    #original: []
    #relations: []
    #hidden: []
    #visible: []
    #appends: []
    #dateFormat: null
    #casts: []
    #touches: []
    #observables: []
    #with: []
    #morphClass: null
    +exists: false
    +wasRecentlyCreated: false
  }
  #related: Company {#212 ▼
    #table: "company"
    #primaryKey: "company_id"
    #guarded: array:1 [▼
      0 => "id"
    ]
    #fillable: []
    #connection: null
    #keyType: "int"
    #perPage: 15
    +incrementing: true
    +timestamps: true
    #attributes: []
    #original: []
    #relations: []
    #hidden: []
    #visible: []
    #appends: []
    #dates: []
    #dateFormat: null
    #casts: []
    #touches: []
    #observables: []
    #with: []
    #morphClass: null
    +exists: false
    +wasRecentlyCreated: false
  }
}

我在公司中有 company_id 作为 pkey,在 joborder 中有 fkey 感谢您的帮助!

【问题讨论】:

    标签: php laravel laravel-5 eloquent


    【解决方案1】:

    你应该打电话

    $company = $newInstance->company()->get();
    

    而不是

    $company = $newInstance->company();
    

    PageController:jobList.
    现在,您不是通过相关数据来恢复关系本身。

    或者,您可以将company 作为属性访问,该属性应自动返回相关数据而不是关系本身:

    $company = $newInstance->company;
    

    【讨论】:

    • 3 小时,tnx。但集合返回空。我有一些 fkey company_id=1 的工作和一个 id=1 的公司,但我得到了 null 或空集合。顺便说一句,我只想要名称和地址。我在这里使用正确的关系吗?
    • 我个人会坚持 laravel 雄辩的命名约定,然后你不需要提供额外的参数来解决关系。但是您的模型不需要,因此您很可能需要提供外键,例如return $this-&gt;belongsTo('App\Company', 'joborder_id'); in Joborder::company
    • 我的错,你的Joborder::company 关系应该是return $this-&gt;belongsTo('App\Company', 'company_id', 'company_id'); 为了只得到名字和地址,你可以使用pluck,见laravel.com/docs/5.6/collections#method-pluck
    【解决方案2】:

    您需要在两个关系中同时指定 foreignKeylocalKey,因为您没有 id 作为主键

    公司模式

    public function jobs() {
         return $this->hasMany('App\Joborder','company_id','company_id');
    }
    

    Joborder模型

    public function company(){
         return $this->belongsTo('App\Company', 'company_id', 'company_id');
    }
    

    现在像这样获取它

    public function joblist() {
        $joblist = Joborder::with('company')->all();
    
        dd($joblist);
    
        return view('pages.joblist')->with($joblist);
    } 
    

    如果您需要获取公司的选定字段,则可以在预加载中指定它$query-&gt;select('name', 'address');

    public function joblist() {
        $joblist = Joborder::with(['company' => function($query){
                             $query->select('name', 'address');
                   }])->get();
    
        return view('pages.joblist')->with($joblist);
    } 
    

    在刀片中,您可以像这样访问公司数据

    @foreach($joblist as $job)
       @if($job->company)
          {{$job->company->name}}
          {{$job->company->address}}
       @endif
    @endforeach
    

    【讨论】:

    • 确实放了那些,但仍然返回空
    • 好的,这正是我想要的,只是我如何访问公司数据?而且我不希望它只获取所有公司数据的名称和地址,这可能吗?
    • 非常感谢老兄,现在我在 Builder.php 行 2405 中得到 BadMethodCallException:调用未定义的方法 Illuminate\Database\Query\Builder::all(),将其更改为 get 但随后我得到 ErrorException 25655af7bffbc458b6eeee304b4909253cf2c9dd.php 第 58 行:试图获取非对象的属性(查看:C:\wamp64\www\resources\views\pages\joblist.blade.php)
    • 是的,使用 get 并在刀片中添加 @if($job-&gt;company) 条件。我已经更新了答案检查它
    • 非常感谢后续跟进,现在所有新更改都完成了,所有关系现在都返回一个空集合,我在 $joblist 上做了一个 dd 并检查了它!我很困惑
    【解决方案3】:

    试试这样的

    public function joblist() {
        $joblist = Joborder::with('company')->get();         
        return view('pages.joblist')->with('jobs',$joblist);
    }
    

    确保公司表中有工作列表的ID。 还要检查外键名称,否则您必须通过 joborder_id 或任何外键名称:

    public function company(){
        return $this->belongsTo('App\Company', 'joborder_id');
    }
    

    【讨论】:

    • 好的!这个有效,它给了我价值,但我认为它不是正确的做法,为什么我们已经设置好关系时还要使用 with,这个功能不应该为我们做这项工作吗?顺便说一句,我如何访问我的公司数据并将其限制为仅获取名称和地址?每个公司的数据是否与其工作相关?
    猜你喜欢
    • 2016-03-31
    • 1970-01-01
    • 2016-02-29
    • 2020-09-08
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多