【问题标题】:How to properly get the parent class using a child class?如何使用子类正确获取父类?
【发布时间】:2025-12-02 07:05:01
【问题描述】:

我有这个父子模型定义为:

class Contract extends Model
{
    public function customer()
    {
        return $this->belongsTo('App\Customer');    
    }
}

在我父母的模型上,即客户我有这个:

public function contracts()
{
    return $this->hasMany('App\Contract', 'customer_id', 'id');
}

在我的ContractController 上,我正在使用以下代码将我的客户及其父模型按父字段排序:

$contracts = Contract::where('status', 'Active')->join('customers', 'contracts.customer_id', '=', 'customers.id')->orderBy('customers.customer_number', 'asc')->paginate(100);

我现在的问题是我的 contract 视图,也就是说,index.blade.php 给了我一个不同的 id,但使用这个:$contracts = Contract::where('status', 'Active')->paginate(100); 工作正常。

编辑

至于合约索引视图,我有这个:

@foreach($contracts as $key => $contract)

<tr>
    <td>{{ $contract->id }}</td>
    <td>{{ $contract->customer ? $contract->customer->customer_number : '' }}</td>
    <td>{{ $contract->customer ? $contract->customer->full_name : '' }}</td>
</tr>

@endforeach

我的问题是,这个合同 ID 显示的是不同的 ID。例如,如果在我的数据库中,ID 为 1 的合同 X 属于客户 X,我的视图会显示不同的合同 ID。

【问题讨论】:

  • 在视图文件中也提供您的代码。也许您正在尝试访问错误的变量
  • 不同的查询不同的结果?什么错误?
  • 我的观点很简单,只是&lt;tr&gt;&lt;td&gt;{{ $contract-&gt;id }}&lt;/td&gt;&lt;td&gt;{{ $contract-&gt;customer ? $contract-&gt;customer-&gt;customer_number : '' }}&lt;/td&gt;&lt;/tr&gt;在一个循环里面。

标签: laravel join orm


【解决方案1】:

我认为关系的问题,做关系的简单方法是使用像这样的急切加载:

$contracts = Contract::with(['customers'=> function($query) {
    $query->orderBy('customers_number', 'asc');
}])->where('status', 'Active')->paginate(100);

【讨论】:

  • 每当我使用它时,它都会给我一个 SQL 错误:Column not found: 1054 Unknown column 'customers.customers_number'
  • 可行,但不是按我的 customer_number 排序,而是根据我的contracts id 排序。
【解决方案2】:

不知何故,我设法解决了我的问题。而不是使用

$contracts = Contract::where('status', 'Active')->join('customers', 'contracts.customer_id', '=', 'customers.id')->orderBy('customers.customer_number', 'asc')->paginate(100);

我用过这个:

$contracts = Contract::select('contracts.*')->where('status', 'Active')->join('customers', 'contracts.customer_id', '=', 'customers.id')->orderBy('customers.customer_number', 'asc')->paginate(100);

我从这个github link发现的

【讨论】: