Отношения запросов Laravel на основе имени, а не ID - PullRequest
0 голосов
/ 30 апреля 2019

Привет, я новичок и немного пытаюсь понять, как запрашивать отношения.Я пытаюсь создать базовый успокоительный API в laravel, и у меня есть 3 модели

class Book extends Model
{

    public function author()
    {
        return $this->belongsTo(Author::class);
    }

    public function categories()
    {
        return $this->belongsToMany('App\Category', 'category_book')
        ->withTimestamps();
    }
}

class Author extends Model
{
    public function books(){
        return $this->hasMany(Book::class);
    }
}

class Category extends Model
{
    public function books()
    {
        return $this->belongsToMany('App\Book', 'category_book')
           ->withTimestamps();
    }
}

Миграции таблиц:

Schema::create('books', function (Blueprint $table) {
        $table->engine = "InnoDB";
        $table->increments('id');
        $table->string('ISBN', 32);
        $table->string('title');
        $table->integer('author_id')->unsigned();
        $table->float('price')->default(0);
        $table->timestamps();
    });

Schema::create('authors', function (Blueprint $table) {
        $table->engine = "InnoDB";
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('surname');
        $table->timestamps();
    });

Schema::create('categories', function (Blueprint $table) {
        $table->engine = "InnoDB";
        $table->bigIncrements('id');
        $table->string('name');
        $table->timestamps();
    }); 

Schema::create('category_book', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('category_id')->unsigned();
        //$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
        $table->integer('book_id')->unsigned();
        //$table->foreign('book_id')->references('id')->on('books')->onDelete('cascade');
        $table->timestamps();
    });   

книги - это главная таблица, и автор имеет отношение один ко многим скниг.Категория имеет много-много отношений с книгами, так как книга может быть в нескольких категориях.

В таблице книг есть поле author_id, чтобы связать его с таблицей авторов.Существует также сводная таблица category_books, которая содержит category_id и book_id для связи книг с категориями

Но как мне запросить книги, чтобы они возвращали только книги, основанные на имени авторов?

Я бытакже нравится делать то же самое, основываясь на названии категории?

У моего контроллера книг есть следующее, но я не уверен, как это сделать правильно

public function index(request $request, Author $author, Category $category)
{

    $author = $request->author;

    $books = Book::find()->author()->where('name', $author);

    $books = Book::with(['categories'])->where('name', $category);

    return response()->json($books, 200);
}

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Чтобы отфильтровать как автора, так и книгу по одному и тому же запросу, вы можете использовать оба запроса, сделанные gbalduzzi вместе:

$books = App\Book::whereHas('author', function ($query) use ($authorName) {
    $query->where('name', $authorName);
})->whereHas('categories', function ($query) use ($categoryName) {
    $query->where('name', $categoryName);
})->get();
0 голосов
/ 30 апреля 2019

По автору:

$books = App\Book::whereHas('author', function ($query) use ($authorName) {
    $query->where('name', $authorName);
})->get();

По категории:

$books = App\Book::whereHas('categories', function ($query) use ($categoryName) {
    $query->where('name', $categoryName);
})->get();

whereHas позволяет выполнять запросы по указанному отношению

Вместе:

$books = App\Book::whereHas('author', function ($query) use ($authorName) {
        $query->where('name', $authorName);
    })->whereHas('categories', function ($query) use ($categoryName) {
        $query->where('name', $categoryName);
    })->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...