Laravel の hasMany() 関係からすべての結果を取得するにはどうすればよいですか? 質問する

Laravel の hasMany() 関係からすべての結果を取得するにはどうすればよいですか? 質問する

たとえば、Product と BaseProduct があるとします。

製品のモデルでは、次のことを指定しました。

//In class Product
public function BaseProduct()
{
    return $this->belongsTo("BaseProduct", "BaseProductId");
}

BaseProduct では、次の関係を指定しました。

//In class BaseProduct
public function Products()
{
    return $this->hasMany("Product", "ProductId");
}

次のように製品を選択するとします。

$Product::first()

次のようにすることで BaseProduct を取得できます。

$Product::first()->BaseProduct()->get();

そこから結果の配列を取得する代わりに、ModelBaseProduct の を取得して、BaseProduct のすべての子、つまりこの BaseProduct に関連する外部キーを持つすべての製品を取得するにはどうすればよいですか。

代わりに試してみましたBaseProduct()->all();が、有効な方法ではありませんでした。


編集:

私は次のような関数呼び出しのチェーンを作成しましたが、ひどいものです。

return BaseProduct::find(Product::first()->BaseProduct()->getResults()['BaseProductId'])->Products()->getResults();

最終編集:

モデルに間違いがありましたBaseProduct。関数内で、であるべき場所Products()を指定していました。return $this->hasMany("Product", "ProductId");ProductIdBaseProductId

これを修正した後、次のように正常に使用できるようになりました。

Product::first()->BaseProduct->products;

シェイク・ヒーラが説明した通りです。

ベストアンサー1

子を取得するには、BaseProduct次を試してください。

$bp = BaseProduct::with('Products')->get();

これでコレクションができたのでBaseProduct、次のようなものを使用できます。

$bp->first()->products

またはコレクションから2番目のアイテムを取得します

$bp->get(1)->products

また、次のようなループを実行することもできます (おそらく、通過後のビューで)。

// From the controller
$bp = BaseProduct::with('Products')->get();
return View::make('view_name')->with('baseProduct', $bp);

の中にView

@foreach($baseProduct->products as $product)
    {{ $product->field_name }}
@endforeach

アップデート:はい、これを試してみてください

$product = Product::first();
$baseProduct = $product->BaseProduct;

// Dump all children/products of this BaseProduct
dd($baseProduct->products->toArray());

次のように連鎖することができます:

Product::first()->BaseProduct->products;

アップデート:テーブル構造は次のようになります。

テーブル:基本製品:

id(pk) | some_field | another_field

表:製品:

id(pk) | baseproduct_id(fk) | another_field

この表の構造によれば、関係は

// BaseProduct
public function Products()
{
    return $this->hasMany("Product");
}

// Product
public function Products()
{
    // second parameter/baseproduct_id is optional unless
    // you have used something else than baseproduct_id
    return $this->belongsTo("BaseProduct", "baseproduct_id");
}

おすすめ記事