mardi 17 mars 2020

Laravel - How to paginate united Many To Many(Polymorphic) collection?

Trying to figure out how to fetch two related models(obviously united) of my Many To Many(Polymorphic) relationship.

What we have:

  • 3 models: Bucket, Template and DesignPack.
  • Bucket has Many-To-Many(Polymorphic) relationship with Template and DesignPack(It means we have pivot table bucketables).In essence Bucket can have(be related with) both: Template and DesignPack.
  • Laravel 6.*

What I want to get:

  • I want to get a Bucket templates and design packs united in one collection and paginated!

Please check one of the solutions I've tried:

$templates = Bucket::find($bucket_id)->templates()->select(['id', 'file_name as name', 'size', 'preview']);        
$design_packs = Bucket::find($bucket_id)->dps()->select(['id', 'name', 'size', 'preview']);

$all = $templates ->union($design_packs )->paginate(10);

Unfortunately that solution throws me the error(thought I checked what each request returns and it returns the same fields, not different):

"SQLSTATE[21000]: Cardinality violation: 1222 The used SELECT statements have a different number of columns (SQL: (select `id`, `size`, `preview`, `bucketables`.`bucket_id` as `pivot_bucket_id`, `bucketables`.`bucketable_id` as `pivot_bucketable_id`, `bucketables`.`bucketable_type` as `pivot_bucketable_type` from `design_packs` inner join `bucketables` on `design_packs`.`id` = `bucketables`.`bucketable_id` where `bucketables`.`bucket_id` = 3 and `bucketables`.`bucketable_type` = App\DesignPack and `design_packs`.`deleted_at` is null) union (select `id`, `size`, `preview` from `templates` inner join `bucketables` on `templates`.`id` = `bucketables`.`bucketable_id` where `bucketables`.`bucket_id` = 3 and `bucketables`.`bucketable_type` = App\Template and `templates`.`deleted_at` is null))"

Are there any different way to get what I want? May be examples, documentation links or any helpful ideas?

Will be so grateful guys for any help! Thank you!



via Chebli Mohamed

Aucun commentaire:

Enregistrer un commentaire