Laravel 尝试 select belongsTo 关系列

Laravel trying to select belongsTo relationship columns

我有一个 Eloquent 模型 App\Listing 其中 belongsTo App\Product

public function product()
{
    return $this->belongsTo(Product::class);
}

在列表控制器中,我试图从产品 table 中获取包含 2 列(namekeywords)的特定列表。

public function readListing(Request $request, $listingId)
{
    $query = Listing::query();
    $item = $query->with(['product' => function (Builder $query) {
        return $query->select(['name', 'keywords']);
    }])->findOrFail($listingId);
    return response()->json($item->toArray(), 200);
}

我收到这个错误:

类型错误 传递给 App\Http\Controllers\API\ListingController::App\Http\Controllers\API{closure}() 的参数 1 必须是 Illuminate\Database\Eloquent\Builder 的实例,给定的 Illuminate\Database\Eloquent\Relations\BelongsTo 实例,在 ...\vendor\[ 中调用=51=]\framework\src\Illuminate\Database\Eloquent\Builder.php 第 580 行

第 580 行是

$item = $query->with(['product' => function (Builder $query) {

当我从行中删除类型声明

$item = $query->with(['product' => function ($query) {

我得到一个结果,但它不包括来自产品 table.

的 2 列(namekeywords
{
    id: 1,
    product_id: 1,
    listing_price: 10,
    actual_price: 5,
    in_stock: 1,
    listing_date: null,
    delisting_date: null,
    created_at: "2021-02-24T12:33:48.000000Z",
    updated_at: "2021-02-24T13:45:25.000000Z",
    deleted_at: null,
    category: "Fruits",
    category_id: 2,
    description: "Rem laudantium aut",
    image_urls: [
        ".../storage/products/February2021/CF3nzhmc0RXevSWdOJcd.jpg",
        ".../storage/products/February2021/oBtXf5kBjkAyrazuFDyu.jpg",
        ".../storage/products/February2021/GfpaGxSoGLA2FBqGrcDX.jpg"
    ],
    image_medium_urls: [
        ".../storage/products/February2021/CF3nzhmc0RXevSWdOJcd-medium.jpg",
        ".../storage/products/February2021/oBtXf5kBjkAyrazuFDyu-medium.jpg",
        ".../storage/products/February2021/GfpaGxSoGLA2FBqGrcDX-medium.jpg"
    ],
    image_small_urls: [
        ".../storage/products/February2021/CF3nzhmc0RXevSWdOJcd-small.jpg",
        ".../storage/products/February2021/oBtXf5kBjkAyrazuFDyu-small.jpg",
        ".../storage/products/February2021/GfpaGxSoGLA2FBqGrcDX-small.jpg"
    ],
    thumbnail_url: ".../storage/products/February2021/CF3nzhmc0RXevSWdOJcd-small.jpg",
    product: null
}

为什么类型声明会导致问题,我如何将它从相关 table 的两列中获取到 select?

您需要在您的案例中包含 foreign_key listing_id

    $query = Listing::with(['product' => function ($query) {
    // add listing_id
        return $query->select(['listing_id', 'name', 'keywords']);
    }])
        ->findOrFail($listingId);

在 laravel docs

中提及

When using this feature, you should always include the id column and any relevant foreign key columns in the list of columns you wish to retrieve.