Ho due modelli che vorrei unire in un'unica timeline. Sono stato in grado di farlo creando una vista in mysql che normalizza e unisce le tabelle. Ho creato un modello per questa vista, NewsFeed
. Funziona bene se non desidero il modello correlato Comment
. Mi sono avvicinato a questo superando il metodo getMorphClass
sul modello. Questo mi consente di ottenere i commenti correlati per le immagini, ma non i post, perché quando si chiama getMorphClass
il modello non ha dati.Due modelli in una query impaginata con relazioni caricate avide usando Laravel
Sono aperto a qualsiasi approccio su come risolvere questo problema, non solo nel modo in cui sto proponendo, ma non voglio estrarre più dati di quelli che devo dal database.
Feed Novità
<?php
namespace App\Users;
use App\Pictures\Picture;
use App\Social\Comments\CommentableTrait;
use App\Posts\Post;
use App\Users\User;
use Illuminate\Database\Eloquent\Model;
class UserFeed extends Model
{
use CommentableTrait;
public function user()
{
return $this->belongsTo(User::class);
}
public function getMorphClass(){
if ($this->type == 'post'){
return Post::class;
}
return Picture::class;
}
}
MySQL View
CREATE VIEW
`user_feeds`
AS SELECT
`posts`.`id` AS `id`,
`posts`.`user_id` AS `user_id`,
'post' AS `type`,
NULL AS `name`,
NULL AS `thumbnail`,
`posts`.`body` AS `body`,
`posts`.`updated_at` AS `updated_at`,
`posts`.`created_at` AS `created_at`
FROM
`posts`
UNION SELECT
`pictures`.`id` AS `id`,
`pictures`.`user_id` AS `user_id`,
'picture' AS `type`,
`pictures`.`name` AS `name`,
`pictures`.`thumbnail` AS `thumbnail`,
`pictures`.`description` AS `body`,
`pictures`.`updated_at` AS `updated_at`,
`pictures`.`created_at` AS `created_at`
FROM
`pictures`;
immagini tavolo
id
user_id
title
img
img_width
img_height
img_other
description
created_at
updated_at
messaggi
id
user_id
title
body
created_at
updated_at
non è possibile utilizzare solo caricamento ansioso? $ var = Picture :: with ('posts', 'comments') ... – futureweb
Il più vicino sarebbe ottenere User :: with (['posts', 'pictures']) -> get(); che non ti dà contenuto impaginato. Ho pensato di fare qualcosa come '$ user-> posts() -> paginate (15);' e '$ user-> pictures() -> paginate (15);' quindi unire le collezioni, ma diventa problematico una volta desidera set di record aggiuntivi. – whoacowboy
perché non impaginare 'Utente :: con (['post', 'immagini']) -> paginate (15);' o anche 'Utente :: con (['post', 'posts.comments', 'immagini' ]) -> paginate (15); 'e anche un metodo di commenti sul modello dei post? – futureweb