:Laravel 5 재귀 함수 대다 내가 다 대다 관계가 참조하는 다음 자기가 모델이라는 제품이 자기 참조 모델
// parent products based on the product_product pivot table
public function parent_products()
{
return $this->belongsToMany('App\Product', 'product_product', 'child_id', 'parent_id')->withPivot('amount');
}
// child products based on the product_product pivot table
public function child_products()
{
return $this->belongsToMany('App\Product', 'product_product', 'parent_id', 'child_id')->withPivot('amount');
}
// movements
public function movements()
{
return $this->hasMany('App\Movement', 'product_id');
}
그렇게 모든 제품은 "이상적"무한한 수를 조상 및 어린이.
또한 어떤 제품도 "구성 요소"와 같이 다른 제품의 구성물입니다.
그래서 각 어린이의 출석률과 제품을 만드는 데 필요한 금액을 기준으로 "생산 가능한"제품의 양을 반환해야합니다.
이것이 한 단계의 문제라면 아무런 문제가 없지만 시스템에서 많은 수위를 가질 수 있도록해야합니다. 그러면 어린이도 어린이에게서 만들 수 있습니다.
각 제품 -> 제품 -> 제품 체인의 깊이를 제어 할 수 없습니다.
성능 문제 외에도 체인의 각 제품에 "생산 가능한"양을 반환하는 재귀 적 방법이 필요합니다.
나는이public function child_products_recursive()
{
return $this->child_products()->with(['child_products_recursive','movements'=>function($query){
$query->whereDate('ready_date', '<=', date('Y-m-d'))->sum('amount');
}]);
}
같은 체인의 마지막까지 반복적으로 아이들을 얻는 방법을 관리하고 그것을 작동합니다.
그러나이 값을 반환하는 방법이나 각 모델을 탐색하는 방법을 알 수 없습니다.
관여 테이블은 그런 "단순화"입니다
products
---------
id | name
---------
1 | something
2 | something
3 | something
4 | something
5 | something
6 | something
7 | something
product_product
-----------------------------
parent_id | child_id | amount (amount of children in the parent product)
-----------------------------
1 | 2 | 2
1 | 3 | 4
2 | 4 | 1.5
2 | 5 | 3
4 | 6 | 0.7
4 | 7 | 0.3
movements table
-------------------------------------
id | product_id | date | amount
-------------------------------------
1 | 4 | 2016-01-06 | 300
2 | 5 | 2016-01-06 | 200
3 | 6 | 2016-01-06 | 125
4 | 7 | 2016-01-06 | 1000
때문에 제품 ID 1은 운동을하지 않지만 움직임이없는 있지만이 될 수있는 아이 제품을 기반으로 여러 조각으로 만들 수 있습니다 어린이 제품으로도 제작할 수 있습니다. 사전에
Wine box Wine box
6 bottles 12 bottles ---1x-- Box for
of Wine3 of Wine4 12 Bottles
/\ | \
/ \ | \
x6 x1 | x12
/ \ | \
Bottle Box for | Bottle
of Wine3 6 Bottles | Label
/| \ |
/ | \ /\
/ | \ / \
/ | \ / \
x1 x0.75 x1 x12 x9
/ | \ / \
Empty | Bottle Wine4
Bottle XY | Cork ABC
|
|
|
|
Wine3
/ \
/ \
x0.7 x0.3
/ \
Wine1 Wine2
감사 :
다음은 시각적 표현 (내가 전에 테이블의 데이터를 따라하지 못했지만, 단지 아이디어를 제공하기 위해)입니다. 챠오
그래, 난 어떤 비슷한 문제를 얻었다 내 시도 – Alessandro