laravel 按关系属性搜索收款记录

uqjltbpv  于 2023-01-27  发布在  其他
关注(0)|答案(2)|浏览(89)

我有一个游戏,人们可以得到一些物品和装备他们。
项目数据放置在两个有关系的表中。
Items表包含所有可能的项目,并且user_items表包含玩家所拥有的项目。

    • 用户项表格:* * 身份证|用户标识|项目标识|已配备
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
    use HasFactory;

    public function userItems()
    {
        return $this->belongsTo(UserItem::class);
    }
}
    • 项目表:* * 身份证|项目名称|主体_部件
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class UserItem extends Model
{
    use HasFactory;

    public function items()
    {
        return $this->hasOne(Item::class, 'id', 'item_id');
    }
}

现在我得到了用户项目的集合$userItems = UserItem::where('user_id', Auth::id())->get(),
如何按相关表的列搜索此集合?例如,我想获取用户$userItems,其中is_equipped == 1body_part == "head"

eanckbw9

eanckbw91#

您需要的是按如下关系过滤:

$userItems = UserItem::where('user_id', Auth::id())->whereHas('items', function($q)
{
    $q->where('is_equipped', '=', 1);

})->get();
toiithl6

toiithl62#

您可以使用Eloquent的关系来通过相关表的列搜索集合。
要获取is_equipment == 1和body_part ==“head”中的用户物品,可以使用以下代码:

$userItems = UserItem::where('user_id', Auth::id())
->whereHas('items', function ($query) {
    $query->where('is_equipped', 1)->where('body_part', 'head');
})->get();

此代码首先在user_items表中查询属于该用户的所有项目。然后,它使用whereHas方法根据相关项目表的列筛选结果。传递给whereHas的闭包接收一个$query变量,该变量是Query Builder的示例,可用于筛选项目表。
您还可以使用join方法将items表连接到user_items表,然后按items表中的列进行过滤:

$userItems = UserItem::join('items', 'items.id', '=', 'user_items.item_id')
    ->where('user_items.user_id', Auth::id())
    ->where('items.is_equipped', 1)
    ->where('items.body_part', 'head')
    ->get();

这将为您提供一个user_items的集合,这些项由用户拥有,并且在items表中具有is_equipment = 1和body_part = 'head'。

相关问题