【问题标题】:Eloquent and Pivot Tables in Laravel 4Laravel 4 中的 Eloquent 和数据透视表
【发布时间】:2014-01-31 20:25:45
【问题描述】:

我有一个 Poll 表、一个 Students 表,以及它们之间的一个数据透视表,其中包括一个令牌和他们的三张选票。

    public function students()
    {
        return $this->belongsToMany('Student', 'polls_students')->withPivot('token','first','second','third');
    }

在保存投票结果时,我遇到了一些我不太理解的奇怪行为。我希望有人能解释我错过了什么:

    $poll = Poll::find(Input::get('poll_id'));

    foreach($poll->students()->where('students.id', '=', Input::get('student_id'))->get() as $student){
        var_dump($student->pivot->token);
    }

    $student = $poll->students()->where('students.id', '=', Input::get('student_id'))->get();
    var_dump($student->pivot->token);

在上面的代码中,foreach循环会成功显示token,第二个会抛出异常Undefined property: Illuminate\Database\Eloquent\Collection::$pivot

我错过了什么?这两个调用在逻辑上不是创建同一个对象吗? “枢轴”如何处理第一个而不是后者?

【问题讨论】:

    标签: php laravel-4 pivot-table eloquent


    【解决方案1】:

    你第一个例子:

    $poll = Poll::find(Input::get('poll_id'));
    foreach($poll->students()->where('students.id', '=', Input::get('student_id'))->get() as $student){
        var_dump($student->pivot->token);
    }
    

    这里$poll->students() 检索一个集合,由于foreach 循环,您在$student 变量中获得了一个对象,您可以使用$student->pivot->token

    你的第二个例子:

    $student = $poll->students()->where('students.id', '=', Input::get('student_id'))->get();
    var_dump($student->pivot->token);
    

    在这里你正在做同样的事情,使用$poll->students() 你得到一个集合,但这次你没有使用循环并尝试使用$student->pivot->token 做同样的事情,但它不起作用,因为你没有定义任何索引如果您尝试这样的操作,您想从中获取pivot->token

    $student->first()->pivot->token
    

    或许

    $student->get(1)->pivot->token
    

    或者你可以像这样使用first() 而不是get()

    $student = $poll->students()->where('students.id', '=', Input::get('student_id'))->first();
    

    然后就可以使用了

    $student->pivot->token
    

    请记住,即使只有一个记录/模型,get() 也会返回一个集合。

    【讨论】:

    • 谢谢。在 Laravel 5.1 中遇到同样的问题(第二个例子)
    【解决方案2】:
    $poll = Poll::find(Input::get('poll_id'));
    
    foreach($poll->students as $student){
    
        var_dump($student->pivot->where('student_id',$student->id)->where('poll_id',$poll->id)->first()->token);
    }
    

    【讨论】:

    • 欢迎来到 StackOverflow! :) 虽然您在答案中包含代码很棒,但如果您包含对您的代码如何以及为什么工作的解释会更好。您可以使用帖子下方的编辑按钮进行更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    相关资源
    最近更新 更多