无需映射即可从书签中获取所有对象

Getting all the objects from a bookmark without mapping

我正在开发一个允许学生搜索并获得房屋的平台。我正在尝试实现一项功能,允许学生为房子添加书签,以便他们以后可以查看它。我遇到的问题是如何检索用户已经加入书签的房屋。我目前通过映射来完成,但这会导致嵌套数组。我知道有一种方法可以不用映射就可以做到。如果有任何帮助,我将不胜感激。

BookmarkController.php

public function userBookmarks()
{
    $user = $this->authUser();
    $bookmarks = Bookmark::where('user_id', $user->id)->get();
    if (count($bookmarks) > 0) {
        $bookmark = $bookmarks->map(function ($favorite, $key) {
            $response = [
                "status" => true,
                "message" => "User's favorites successfully retrieved",
                "data" => House::find($bookmark->house_id),
            ];
            return $response;
        });
        return response()->json($bookmark);
    } else {
        return response()->json([
            "message" => "This user doesn't have any favorites yet",
            "data" => null,
        ]);
    }
}

User.php

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

Bookmark.php

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

这就是为什么在 map 函数中 $booksmark 变量不存在的原因!

我猜你的意思是$favourite(看看你在匿名函数中传递的参数)。

看看这段代码:

public function userBookmarks()
{
    $bookmarks = Bookmark::where('user_id', $this->authUser()->id)->get();

    if (empty($bookmarks)) {
        return response()->json([
            "message" => "This user doesn't have any favorites yet",
            "data"    => null,
        ]);
    }

    $bookmark = $bookmarks->map(function (Bookmark $favorite): array {
        return [
            "status"  => true,
            "message" => "User's favorites successfully retrieved",
            "data"    => House::find($favorite->house_id),
        ];
    });

    return response()->json($bookmark);
}

编辑:如果你想在匿名函数中传递一个变量,可以使用 use 关键字。 类似于(如果 $favourite 来自其他地方):

$fixedPrice = 100;
$items->map(function(Item $item) use ($fixedPrice): array {
    return [
        'id'    => $item->id,
        'price' => $fixedPrice.
    ];
});

我想出了一个解决方案。

public function userFavorites(){
        $user = $this->authUser();
        $bookmarks = $user->bookmarks;
        if(!empty($bookmarks)){
            $houseIds = $bookmarks->pluck('house_id');
            $houses = House::whereIn('id',$arr)->get();
            $response = [
                "status" => true, 
                "message" => "User's bookmarks successfully retrieved", 
                "data" => $houses
            ];
            return response()->json($response);
        }
        else
        {
            return response()->json([
            "status"=> true,
            "message" => "This user doesn't have any bookmarks yet",
            "data" => null
            ]);
        }
    }