как получить данные из laravel отношения? - PullRequest
0 голосов
/ 08 мая 2020

Здравствуйте, я пытаюсь сделать приложение-викторину с 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);
          }
        }
      }
    }

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Для вашей формы листинга, вероятно, у вас уже есть $categories = Categories::all(). Затем, чтобы получить все вопросы этой категории после отправки, вы должны сначала получить категорию, а затем вопросы к ней. Допустим, у вас есть идентификатор категории в вашей форме:

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

Я вижу, вы используете ярлык категории для своего URL-адреса, также можете использовать его, чтобы найти категорию:

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;
}
0 голосов
/ 08 мая 2020

Попробуйте заменить '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(); }

...