Laravel API условных отношений - PullRequest
0 голосов
/ 04 апреля 2020

Я создаю Laravel Приложение, в котором люди читают книги, а также любимые книги.

Ресурсы книг

public function toArray($request)
{
   // return parent::toArray($request);
   return [
        'id' => $this->id,
        'name' => $this->name,
        'about' => $this->about,
        'content' => $this->content,
        'image' => $this->image_url,
        'recommended' => $this->recommended,
        'created_at' => $this->created_at,
        'updated_at' => $this->updated_at,
        'author' => $this->author,
        'no_of_pages' => $this->pages,
   //    'favorited' =>  I want o show true or false depending if user favorited 
   ];
}

Я хочу включить в избранное Книга пользователя в пользовательской модели, поэтому она показывает значение true, если пользователь добавил в избранное и false.

Я смог сделать это в одной модели книги, выполнив это

public function showapi(Request $request, $book)
{

    //$book = Book::find($book);
    $book  = new BookResource(Book::find($book));
    $Fav = Favorite::where('book_id', $book->id)->where('user_id', $request->user_id)->exists();
    if($Fav) {
    return response()->json([
        'book' => $book, 
        'Favorited' => $Fav,
        ]
    );
  }
  else 
  return response()->json([
    'book' => $book, 
    'Favorited' => $Fav,
    ]
);

}

Этот набор Избранное в True или False

Но я хочу показать Избранное в момент отправки коллекции Книг

I пытался использовать Laravel API Resource Relationship, выполняя это

    'item' => FavoriteResource::collection($this->when(Favorite::where('book_id', $this->id)
->where('user_id', $request->user_id), 'item')),

Я получил эту ошибку при использовании почтальона для проверки

Сначала вызов функции-члена () по строке в файле

Это мой метод

public function indexapi()
{
  return BookResource::collection(Book::with('author')->Paginate(16));
}

Это мои отношения

Модель пользователя

public function favorites(){
    return $this->hasMany(Favorite::class);
}

public function books()
{
    return $this->belongsToMany(Book::class);
}

Книжная модель

public function favorites()
{
    return $this->hasMany(Favorite::class);
}

** Любимая модель **

public function book ()
{
    return $this->belongsTo(Book::class);
}

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

public function user()
{
    return $this->belongsTo(User::class);
}

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Я не знаю, является ли это решением вашей проблемы, но просто хочу отредактировать вашу модель, поскольку вы пропустили деталь в книжной модели

Модель пользователя

    public function favorites(){
    return $this->hasMany(Favorite::class);
}

public function books()
{
    return $this->belongsToMany(Book::class);
}

Книжная модель

public function favorites()
{
    return $this->hasMany(Favorite::class);
}
public function User()
{
    return $this->hasOne(User::class);
}

Ваш любимый класс

 public function book ()
{
    return $this->belongsTo(Book::class);
}

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

public function user()
{
    return $this->belongsTo(User::class);
}
0 голосов
/ 04 апреля 2020

У вас есть много-много отношений между вашими книгами и вашими пользователями. Пары хранятся в промежуточной таблице book_user. Просто добавьте логический столбец favorite в промежуточную таблицу book_user.

Вы можете получить к нему доступ следующим образом:

$user = App\User::find(1);

foreach ($user->books as $book) {
    echo $book->pivot->favorite;
}

Подробнее о промежуточной таблице здесь .

Вы также можете создать модель, представляющую промежуточную таблицу (это будет ваша любимая модель).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...