Llamada a una relación indefinida en el modelo laravel usando el alcan

Llamada a una relación indefinida en el modelo laravel usando el alcance

Estoy tratando de obtener 5 publicaciones para cada categoría, así que hice una pequeña búsqueda y terminé aquí Obtener n Publicaciones por categoría Pero recibo una llamada extraña a una relación indefinida en el modelo cuando lo uso con alcance, pero todo funciona bien si no uso un alcance. Aquí está el modelo de categoría

   //Relationship with posts
    public function posts(){
        return $this->hasMany('App\Post');
    }

ámbito por grupo

public function scopeNPerGroup($query, $group, $n = 10)
    {
        // queried table
        $table = ($this->getTable());

        // initialize MySQL variables inline
        $query->from( \DB::raw("(SELECT @rank:=0, @group:=0) as vars, {$table}") );

        // if no columns already selected, let's select *
        if ( ! $query->getQuery()->columns) 
        { 
            $query->select("{$table}.*"); 
        }

        // make sure column aliases are unique
        $groupAlias = 'group_'.md5(time());
        $rankAlias  = 'rank_'.md5(time());

        // apply mysql variables
        $query->addSelect(\DB::raw(
            "@rank := IF(@group = {$group}, @rank+1, 1) as {$rankAlias}, @group := {$group} as {$groupAlias}"
        ));

        // make sure first order clause is the group order
        $query->getQuery()->orders = (array) $query->getQuery()->orders;
        array_unshift($query->getQuery()->orders, ['column' => $group, 'direction' => 'asc']);

        // prepare subquery
        $subQuery = $query->toSql();

        // prepare new main base Query\Builder
        $newBase = $this->newQuery()
            ->from(\DB::raw("({$subQuery}) as {$table}"))
            ->mergeBindings($query->getQuery())
            ->where($rankAlias, '<=', $n)
            ->getQuery();

        // replace underlying builder to get rid of previous clauses
        $query->setQuery($newBase);
    }

Llamando a Npergroup con relación

public function latestposts()
    {
        return $this->posts()->latest()->nPerGroup('category_id', 5);
    }

Relación de modelo de publicación

//Post belongs to Category
 public function category(){
        return $this->belongsTo('App\Category');
    }

En mi controlador de categorías estoy llamando a latestposts a través de

$categories = Category::with('latestposts')->get();

Pero recibo el error: Call to undefined relationship on model

Lo que quiero es: Obtenga el número N de publicaciones por cada categoría, pero estoy completamente perdido en este punto. Cualquier ayuda sería apreciada

Referencia: Tweaking relaciones Eloquent: cómo obtener ¿N modelos relacionados por padre?

Mostrar la mejor respuesta

¿Cuál es el propósito principal de su alcance?

El alcance se usa para obtener las 5 publicaciones por categoría @ChiragPatel

Estoy dando esta respuesta en función de su propósito de que desee 5 publicaciones por categoría. Así que tienes Modelo de categoría y Modelo de publicación.

Y en el modelo de categoría tienes una relación con el modelo de publicación como este

    //Relationship with posts
    public function posts(){
        return $this->hasMany('App\Post');
    }

Y en el modelo de publicación tiene relación con el modelo de categoría como este

//Post belongs to Category
 public function category(){
        return $this->belongsTo('App\Category');
    }

Muestro a tu pregunta que has hecho consultas SQL.

En lugar de eso, puede usar dos enfoques

1) Dar condición mientras eagar carga

$categories = Category::with(['posts' => function ($query) {
    $query->orderBy('created_at', 'desc')->take(5);
}])->get();

Nota: este enfoque solo funcionará cuando tome solo un resultado de padre e hijo usando el método first().

Para obtener n número de publicaciones por categoría, use esto.

Primero, puede recuperar todas las categorías con

$categories = Category::all();

Luego puede usar el bucle foreach y en todas las $category tiene que asignar un nuevo atributo como aquí lastestposts,

foreach ($categories as $category)
{
    $category->latestposts = $category->posts()->orderBy('created_at','desc')->take(5)->get();
}

Después de este ciclo foreach obtendrás las últimas 5 publicaciones en todas las categorías.

Prueba esto en tu código y comenta tus consultas y reseñas.

Sí, ambos son iguales y los probé antes de profundizar en la investigación, ambos darán posts solo en la última categoría

Sí, lo he probado y no funciona. Realmente lo siento por eso. La carga de Eagar funcionará solo para un modelo principal. Así que puedes usar otro concepto. Revisa mi respuesta actualizada.

¿Has probado esto actualmente? Me está dando solo 5 publicaciones.

Sí. Lo he intentado y está funcionando. Y quieres 5 publicaciones, ¿verdad?

Quiero 5 publicaciones para todas las categorías relacionadas, no solo 5 publicaciones. Me gusta si tengo categorías Tecnología, Medios, Educación. Entonces quiero 5 publicaciones de todas y cada una de las categorías de Tecnología, Medios, Educación