【问题标题】:Laravel Eloquent Relationship ConfusionLaravel 雄辩的关系混淆
【发布时间】:2015-03-05 07:48:21
【问题描述】:

这是我的情况;

  • 我有一个协议表,其中列出了不同类型的协议。它基本上是一个查找表。
  • 我有一个 client_agreements 表,其中列出了哪些客户已经签署了哪种类型的协议。我在这个表中有一个agreement_id(外键ID)。

当我使用 Laravel 时,这是我的 Controller 方法来查看特定客户端的所有协议;

public function index($client_id)
{
    $client_agreements = Agreement::find($client_id);

    return View::make('client_agreements.index')
        ->with('client_agreements', $client_agreements);
}

这是我的Agreement 模特;

class Agreement extends Eloquent {

    protected $table = 'agreements';

    public function client_agreements(){

        return $this->hasMany('ClientAgreement', 'agreement_id');
    }

}

所以我想从agreements表的视图中输出;

  • agreement_type
  • 级别

来自client_agreements 表;

  • 开始日期
  • 过期日期

我的视图代码(我确定是错的,但不知道为什么)本质上是;

@foreach($client_agreements as $client_agreement)
    <tr>
        <td>{{ $client_agreement->agreement_type }}</td>
        <td>{{ $client_agreement->level }}</td>
        <td>{{ $client_agreement->start_date }}</td>
        <td>{{ $client_agreement->expire_date }}</td>
    </tr>
@endforeach

我做错了什么?

【问题讨论】:

    标签: php arrays laravel eloquent


    【解决方案1】:

    你可以这样做:

    $client = Client::with('agreements')->find($client_id);
    $client_agreements = $client->agreements;
    return View::make('client_agreements.index')
               ->with('client_agreements', $client_agreements);
    

    在你看来:

    @foreach($client_agreements as $client_agreement)
        <tr>
            <td>{{ $client_agreement->agreement_type }}</td>
            <td>{{ $client_agreement->level }}</td>
            <td>{{ $client_agreement->pivot->start_date }}</td>
            <td>{{ $client_agreement->pivot->expire_date }}</td>
        </tr>
    @endforeach
    

    这需要以下设置:

    客户端模型

    class Client extends Eloquent {
    
        public function agreements(){
            return $this->belongsToMany('Agreement', 'client_agreements')->withPivot('id', 'start_date', 'expire_date');
        }
    }
    

    协议模型

    class Agreement extends Eloquent {
    
        public function clients(){
            return $this->belongsToMany('Client', 'client_agreements')->withPivot('id', 'start_date', 'expire_date');
        }
    }
    

    更多信息请阅读Eloquent docs(尤其是关于关系的部分)

    【讨论】:

    • 我实际上已经有一个客户端模型 - 或者您可能刚刚发现我可能会这样做。您的解决方案有效,谢谢!你能解释一下为什么我必须在这里涉及客户端模型/类吗?我无法完全想象它.. 即使在阅读了文档之后。
    • 好吧,无论如何您都必须涉及客户端模型。您可以尝试使用$client_id 获取与客户端有关系的所有协议,但这会使访问数据透视数据变得更加复杂。在这种情况下,我将始终从我拥有 id 的实体“开始”...你知道我的意思吗?
    • 我从来没有想过在这一点上包含客户端模型,所以看起来我还有更多的阅读要做。你知道我如何显示client_agreements.id 值吗?如果我在视图中执行$client_agreement-&gt;id,那么只会显示agreements.id 值..
    • 尝试$client_agreement-&gt;pivot-&gt;id 如果这不起作用,您需要将id 添加到关系中的withPivot 调用中。我知道两个外键(client_idagreement_id)在 pivot 对象中自动可用,但我不确定 id 本身...
    • 我不得不将id 添加到关系中,但它确实有效.. 谢谢。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2015-03-14
    • 2018-11-28
    • 2015-01-11
    • 2021-06-03
    • 2020-03-26
    • 1970-01-01
    相关资源
    最近更新 更多