55use Closure ;
66use Illuminate \Database \Eloquent \Builder ;
77use Illuminate \Database \Eloquent \Model ;
8+ use Illuminate \Support \Arr ;
9+ use Illuminate \Validation \Rule ;
810use Lomkit \Rest \Concerns \Relations \HasPivotFields ;
911use Lomkit \Rest \Contracts \QueryBuilder ;
1012use Lomkit \Rest \Contracts \RelationResource ;
13+ use Lomkit \Rest \Http \Resource ;
14+ use Lomkit \Rest \Relations \Traits \HasMultipleResults ;
1115
1216class BelongsToMany extends Relation implements RelationResource
1317{
14- use HasPivotFields;
18+ use HasPivotFields, HasMultipleResults;
19+
20+ public function rules (Resource $ resource , string $ prefix )
21+ {
22+ return array_merge (
23+ parent ::rules ($ resource , $ prefix ),
24+ [
25+ $ prefix .'.*.pivot ' => [
26+ 'prohibited_if: ' .$ prefix .'.*.operation,detach ' ,
27+ 'array: ' .Arr::join ($ this ->getPivotFields (), ', ' )
28+ ]
29+ ]
30+ );
31+ }
1532
1633 public function afterMutating (Model $ model , Relation $ relation , array $ mutationRelations )
1734 {
1835 foreach ($ mutationRelations [$ relation ->relation ] as $ mutationRelation ) {
19- $ model
20- ->{$ relation ->relation }()
21- ->{$ mutationRelation ['operation ' ] === 'detach ' ? 'detach ' : 'attach ' }(
22- app ()->make (QueryBuilder::class, ['resource ' => $ relation ->resource ()])
23- ->applyMutation ($ mutationRelation )
24- );
36+ if ($ mutationRelation ['operation ' ] === 'detach ' ) {
37+ $ model
38+ ->{$ relation ->relation }()
39+ ->detach (
40+ app ()->make (QueryBuilder::class, ['resource ' => $ relation ->resource ()])
41+ ->applyMutation ($ mutationRelation )
42+ ->getKey ()
43+ );
44+ } else {
45+ $ model
46+ ->{$ relation ->relation }()
47+ ->attach (
48+ [
49+ app ()->make (QueryBuilder::class, ['resource ' => $ relation ->resource ()])
50+ ->applyMutation ($ mutationRelation )
51+ ->getKey ()
52+ =>
53+ $ mutationRelation ['pivot ' ] ?? []
54+ ]
55+ );
56+ }
2557 }
2658 }
2759}
0 commit comments