Laravel красноречивое объединение нескольких таблиц с фильтром

В моей системе есть три таблицы.

  1. Ученики
  2. статьи
  3. категории

Студент может написать много статей, и статья принадлежит только одному студенту. И статья может иметь только одну категорию.

контроллер

public function all_articles_by_student_by_category(Request $request){$students_id = $request->students_id;
$categories_id = $request->categories_id;$article_list = Students::find($students_id)->articles->all();

//This return Something like, Select All Articles Written by Damith
}

модель

class Students extends Model
{
protected $fillable = ['id','first_name', 'last_name', 'age', 'created_at', 'updated_at'];

public function articles()
{
return $this->hasMany('App\Articles');
}
}

Что я пытаюсь получить

Что-то вроде «Выбрать все статьи, написанные Дамитом для категории технологий» (там должно быть название категории)

Что я могу сделать до сих пор

Что-то вроде, выберите все статьи, написанные Дамитом, используя $article_list = Students::find($students_id)->articles->all(); (Вы можете найти этот код из контроллера)

Что я хочу от тебя

Как мне изменить $article_list = Students::find($students_id)->articles->all(); чтобы получить, что-то вроде, выберите все статьи, написанные Дамитом для категории технологии. (Имя категории должно быть там в результате, и оно находится в таблице категорий, и для условия, где вы можете использовать category_id, который я в таблице статьи )

1

Решение

Сначала с что ты сделал до сих пор ->all() Метод не требуется при получении записей для отношения на модели, он будет возвращать все статьи, связанные с этим студентом:

Students::find($students_id)->articles

Пройдите Статьи Модель
Вы могли бы сделать что-то вроде:

Article::where('student_id', $students_id)
->where('category_id', $category_id)->get();

Который достиг бы результата, которого вы добиваетесь.


Пройти через модель студентов

Если вы хотите пройти Students Model Вы можете ограничить отношения, используя with метод.

$student = Students::with(['articles' => function($query) use ($category_id) {
$query->where('category_id', $category_id);
}])->find($student_id);

$filteredArticles = $student->articles

Полезные ссылки

При доступе к отношениям Eloquent в качестве свойств данные отношений «загружаются лениво». Это означает, что данные отношений фактически не загружаются, пока вы не получите первый доступ к свойству. Однако Eloquent может «загружать» отношения во время запроса родительской модели.

Иногда вы можете захотеть загрузить отношения, но также указать дополнительные ограничения запроса для запроса загрузки.

1

Другие решения

Примерно так должно работать:

$technologyArticles = Articles::where('student_id', '=', $students_id)->where('category_id', '=', $categories_id)->get();
2

По вопросам рекламы [email protected]