【问题标题】:Get scope from multilevel relationship in Laravel从 Laravel 中的多级关系中获取范围
【发布时间】:2017-05-30 00:35:00
【问题描述】:

问题描述: 所以我现在已经尝试了很多东西,但我无法让它发挥作用。使用当前代码,我在行上得到“调用 null 时的成员函数 thisyear()”

控制器:

public function index()
{
    $rows = SeatRows::all();
    return view('seating.index')
            ->withRows($rows);
}

SeatRows 型号:

class SeatRows extends Model {

    protected $table = 'seat_rows';

    public function seats() {
        return $this->hasMany('Seats', 'row_id');
    }

}

座椅型号:

class Seats extends Model {

    protected $table = 'seats';

    protected $fillable = [
        'name',
        'slug',
        'row_id',
    ];

    function row() {
        return $this->hasOne('SeatRows', 'id', 'row_id');
    }

    function reservation() {
        return $this->hasOne('SeatReservation', 'seat_id', 'id');
    }

}

座位预订模式:

class SeatReservation extends Model {

    function seat() {
        return $this->hasOne('Seats', 'id', 'seat_id');
    }

    function reservedfor() {
        return $this->hasOne('User', 'id', 'reservedfor_id');
    }

    function reservedby() {
        return $this->hasOne('User', 'id', 'reservedby_id');
    }

    public function scopeThisYear($query) {
        return $query->where('year', '=', \Setting::get('SEATING_YEAR'));
    }
}

查看:

@foreach($rows as $row)

    <li class="seat-row">
        <ul class="seat-row-{{$row->slug}}">
            @foreach($row->seats as $seat)
                <li class="seat @if($seat->reservation->thisyear()->count() > 0) @if($seat->reservation->thisyear()->status->id == 1) seat-reserved @elseif($seat->reservation->thisyear()->status->id == 2) seat-tempreserved @endif @if(Sentinel::getUser()->id == $seat->reservation->thisyear()->first()->reservedfor->id and $seat->reservation->thisyear()->first()->status->id == 1) seat-yours @endif  @endif @if(Request::segment(3) == $seat->slug) active @endif ">
                    <p>
                        @if($seat->reservation->thisyear()->count() == 0)
                            <a href="{{ route('seating-show', $seat->slug) }}" data-toggle="tooltip" title="Available">{{ $seat->name }}</a>
                        @elseif(Sentinel::getUser()->id == $seat->reservation->thisyear()->reservedfor->id and $seat->reservation->thisyear()->status->id == 1)
                            <a href="{{ route('seating-show', $seat->slug) }}" data-toggle="tooltip" title="This seat is reserved for you!">{{ $seat->name }}</a>
                        @elseif($seat->reservation->thisyear()->status->id == 1)
                            <a href="{{ route('seating-show', $seat->slug) }}" data-toggle="tooltip" title="Reserved for: {{ User::getUsernameAndFullnameByID($seat->reservation->thisyear()->reservedfor->id) }}">{{ $seat->name }}</a>
                        @elseif($seat->reservation->thisyear()->status->id == 2)
                            <a href="{{ route('seating-show', $seat->slug) }}" data-toggle="tooltip" title="Temporary Reserved By: {{ User::getUsernameAndFullnameByID($seat->reservation->thisyear()->reservedfor->id) }}">{{ $seat->name }}</a>
                        @else
                            {{ $seat->name }}
                        @endif
                    </p>
                </li>
            @endforeach
        </ul>
    </li>
@endforeach

【问题讨论】:

  • 请您也显示您与reservedforstatus 的关系吗?

标签: laravel laravel-5


【解决方案1】:

在我看来,您的关系和查询定义有些奇怪。在我看来 Seats hasMany SeatReservations(每年一个)而不是 hasOne。

此外,您的代码可能不起作用,因为特定座位可能没有预订,在这种情况下,您将永远无法到达 thisyear() 来检查人数。

我认为你需要改变称呼你关系的方式。见:Laravel. Use scope() in models with relation

这样的事情可能会奏效:

class Seats extends Model {
    function reservationThisYear() {
        return $this->hasMany('SeatReservation', 'seat_id', 'id')->thisYear();
    }

}

另外,不要混用 -&gt;count()-&gt;id。计数仅存在于返回数组中。如果 hasOne 不存在且计数不为 0,则 hasOne 将返回 null。由于我们现在使用 hasMany,您可以使用 $seat-&gt;reservationThisYear-&gt;count(),但您需要使用 $seat-&gt;reservationThisYear[0]-&gt;reservedfor-&gt;id

注意:如果 reservedfor 关系不匹配任何行,使用 $seat-&gt;reservationThisYear[0]-&gt;reservedfor-&gt;id 将导致 PHP 错误。 (即不预留席位。)

【讨论】:

  • 这真的很好用!感谢您的解决方案,我想我昨天想得太累了。也感谢您的提示!自上次我从事这个项目以来已经一年了。 :)
猜你喜欢
  • 1970-01-01
  • 2019-03-29
  • 2023-04-09
  • 2019-05-23
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 2019-09-18
相关资源
最近更新 更多