【问题标题】:how to retrieve data from laravel relationship?如何从 laravel 关系中检索数据?
【发布时间】:2020-08-23 21:53:42
【问题描述】:

您好,我正在尝试使用 laravel 做一个测验应用程序,并且我正在努力检索我的类别问题..

我对此有一个难看的解决方案,但它不是动态的..

public function startQuiz(Request $request){
  $questions = Question::all();

  foreach ($questions as $key => $question) {
    dd($question->where('categories_id', 'LIKE', 2)->get()); // i want to change the 2 to the real category id 
  }
}

我认为我可以通过 $question->category->id 之类的关系来做到这一点,但不会起作用。

这是我的模型:

class Question extends Model
{
    protected $fillable = ['question_text', 'categories_id', 'correct_answer', 'options'];
    protected $casts = ['options' => 'array'];

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

class Category extends Model
{
    protected $fillable = ['name', 'slug'];

    public function question()
    {
        return $this->hasMany(Question::class, 'questions_id');
    }

我不能以某种方式传递 id 并检查它我不知道为什么.. 那是我传递类别的表单:

@section('content-categories')
<div class="card">
  <div class="card-header">Choose Category to Start</div>
  <div class="card-body">
    @foreach($categories as $category)
      <form class="form-group" action="{{route('user.quiz', $category->slug)}}" method="post">
        @csrf
        <input type="submit" name="categoryTest" class="form-control" value="{{$category->name}}">
      </form>
    @endforeach
  </div>
</div>
@endsection

编辑: 我想我知道为什么我无法通过我的关系检索数据..我在类别类中的关系有错误,我没有 questions_id 字段,我将其替换为:

    public function question()
    {
        return $this->hasMany(Question::class);
    } 

现在我可以得到以下问题:

public function startQuiz(Request $request){
      $questions = Question::all();
      $questionsCategory = [];
      if($request){
        foreach ($questions as $question) {
          if ($request->categoryTest == $question->category->name) {
            $questionsCategory = $question->where('categories_id', '=', $question->category->id)
                                          ->get();
            var_dump($questionsCategory);
          }
        }
      }
    }

【问题讨论】:

  • 你试过删除foreach上的dd(...)函数吗?
  • 是的,我想显示一些东西,但我也删除了 dd
  • 放置LIKE=

标签: php laravel eloquent relationship laravel-blade


【解决方案1】:

对于您的表单列表,您可能已经拥有$categories = Categories::all()。 接下来要在提交后获得该类别的所有问题,您应该首先获得该类别,然后再获得该类别的问题。 假设您的表单中有类别 ID:

$categoryQuestions = Category::find($request->get('id'))->questions;

我看到你正在为你的 url 使用类别 slug,也可以使用它来查找类别:

public function startQuiz(Request $request, string $slug){
   $questions = Category::whereSlug($slug)->first()->questions;
   ...
}

奖金: 在您的服务提供商中,您可以将 {category} 直接绑定到您的模型,如下所示:

Route::bind('category', function($value) {
   return Category::whereSlug('slug', $value)->first();
});

然后您的类别将在控制器方法中可用:

public function startQuiz(Request $request, Category $category){
    $questions = $category->questions;
}

【讨论】:

    【解决方案2】:

    尝试将'LIKE' 替换为'='。并删除dd(...)像这样:

    foreach ($questions as $key => $question) { dd($question->where('categories_id', 'LIKE', 2)->get()); }

    到:

    foreach ($questions as $key => $question) { $question->where('categories_id', '=', 2)->get(); }

    【讨论】:

      猜你喜欢
      • 2019-12-11
      • 2022-07-27
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 2018-02-10
      • 1970-01-01
      相关资源
      最近更新 更多