web-dev-qa-db-ja.com

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

たとえば、ある製品と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();
_

その結果の配列を取得する代わりに、BaseProductのModelを取得して、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;
_

シェイク・ヒーラが説明したように。

8

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;

更新:テーブル構造は次のようになります。

Table:baseproduct

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");
}
19
The Alpha
$product = Product::find('id');
$baseProduct = $product->baseProduct()->getModel();
$baseProducts->products()->getModels();
0
user1848769