简体   繁体   English

Laravel 刀片,无法访问刀片文件中的关系

[英]Laravel blade, cannot access relationship in blade file

I have simple implementation of oneToMany, Category -> Features, but cannot access features from blade template.我有 oneToMany、Category -> Features 的简单实现,但无法从刀片模板访问功能。

Controller: Controller:

<?php

namespace App\Http\Controllers;

use App\Http\Requests\StoreVenueRequest;
use Illuminate\Http\Request;
use App\Models\Feature;
use App\Models\Category;
use App\Models\City;
use App\Models\Venue;

class VenueController extends Controller
{
    public function create(Category $category)
    {
        $categories = Category::all();
        $cities = City::all();

        // dd($category->features);

        return view('frontend.venues.create', [
            'category' => $category,
            'categories' => $categories,
            'cities' => $cities,
        ]);
    }
}

Template (create.blade.php):模板(create.blade.php):

                        <div class="checkboxes in-row amenities_checkbox">
                            {{ dd($category->features) }}
                            <ul>
                                @foreach ($category->features as $feature)
                                    <li>
                                        <input id="{{ $feature->code }}" value="{{ $feature->id }}" type="checkbox" name="features_bool[]">
                                        <label for="{{ $feature->code }}">{{ $feature->name_bg }}</label>
                                    </li>
                                @endforeach

                            </ul>

                        </div>

Category Model:类别 Model:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    use HasFactory;

    public function venues()
    {
        return $this->hasMany(Venue::class);
    }

    public function features()
    {
        return $this->hasMany(Feature::class);
    }
}

Feature Model:功能 Model:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Feature extends Model
{
    use HasFactory;

    public function category()
    {
        return $this->belongsTo(Category::class);
    }
}

Commented row in the controller dd($category->features); controller dd($category->features); returns:返回:

Illuminate\Database\Eloquent\Collection {#1411 ▼
  #items: array:8 [▼
    0 => App\Models\Feature {#1434 ▶}
    1 => App\Models\Feature {#1429 ▶}
    2 => App\Models\Feature {#1452 ▶}
    3 => App\Models\Feature {#1407 ▶}
    4 => App\Models\Feature {#1456 ▶}
    5 => App\Models\Feature {#1458 ▶}
    6 => App\Models\Feature {#1439 ▶}
    7 => App\Models\Feature {#1254 ▶}
  ]
  #escapeWhenCastingToString: false
}

Same row in the blade file {{ dd($category->features) }} returns empty array:刀片文件{{ dd($category->features) }}中的同一行返回空数组:

Illuminate\Database\Eloquent\Collection {#1447 ▼
  #items: []
  #escapeWhenCastingToString: false
}

I checked most of the questions with simmiliar problems, but without any success.我检查了大多数具有类似问题的问题,但没有任何成功。 I have needed relationships hasMany and belongsTo我需要关系hasManybelongsTo


Well, my guess is when you try to load features server-side, Laravel can lazy query your relation and include it to your model, but if you do the same directly on blade, it's too late so your collection remains empty.好吧,我的猜测是,当您尝试在服务器端加载features时,Laravel 可以延迟查询您的关系并将其包含到您的 model 中,但如果您直接在刀片上执行相同操作,则为时已晚,因此您的集合仍然是空的。

If you need to load your relation punctually, you can get a fresh instance of your model and load relations:如果您需要准时加载关系,您可以获得 model 的新实例并加载关系:

public function create(Category $category)
{
    $categories = Category::all();
    $cities = City::all();

    // dd($category->features);

    return view('frontend.venues.create', [
        'category' => $category->fresh(['features']),
        'categories' => $categories,
        'cities' => $cities,
    ]);
}

but if you need thoses relations every time the model is loaded, then you can overwrite the property $with in your model class:但是如果每次加载 model 时都需要这些关系,那么您可以在 model class 中覆盖$with属性:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    use HasFactory;

    /**
     * The relations to eager load on every query.
     *
     * @var array
     */
    protected $with = ['features'];

    public function venues()
    {
        return $this->hasMany(Venue::class);
    }

    public function features()
    {
        return $this->hasMany(Feature::class);
    }
}

Have you tried to return with $id ?您是否尝试使用$id返回? You said in the comment that there is a problem with the id.你在评论中说id有问题。

Maybe in your controller try something like this:也许在你的 controller 尝试这样的事情:

public function create($id)
    {
        $category = Category::find($id);
        return view('frontend.venue.create',compact('project'));
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM