Consulta personalizada dentro del modelo relacionado elocuente laravel

Consulta personalizada dentro del modelo relacionado elocuente laravel

He estado buscando la forma correcta de lograr lo siguiente.

  • Recuperar una colección de modelos y sus relaciones
  • Para una relación determinada, ajústela para devolver los valores definidos por una consulta personalizada

Entonces, por ejemplo, los usuarios modelo están vinculados a una tabla de estadísticas archivada. Sin embargo, estas estadísticas deben sumarse con varias fuentes de datos en otros modelos que no se relacionan fácilmente a través de ORM elocuentes

Mostrar la mejor respuesta

Muestra el código y comparte la versión de Laravel.

encontraste solucion?

Supongo que buscas SCOPES:

Los ámbitos le permiten definir conjuntos comunes de restricciones que puede reutilizar fácilmente en toda su aplicación. Por ejemplo, es posible que deba recuperar con frecuencia todos los usuarios que se consideran "populares". Para definir un ámbito, prefije un método de modelo Eloquent con scope.

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Scope a query to only include popular users.
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopePopular($query)
    {
        return $query->where('votes', '>', 100);
    }

    /**
     * Scope a query to only include active users.
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeActive($query)
    {
        return $query->where('active', 1);
    }
}

Una vez que se ha definido el alcance, puede llamar a los métodos de alcance al consultar el modelo. Sin embargo, no debe incluir el prefijo de ámbito al llamar al método. Incluso puede encadenar llamadas a varios ámbitos, por ejemplo:

$users = App\User::popular()->active()->orderBy('created_at')->get();

En ocasiones, es posible que desee definir un ámbito que acepte parámetros. Para comenzar, simplemente agregue sus parámetros adicionales a su alcance. Los parámetros de alcance deben definirse después del parámetro $query.

Lo encontrará en la documentación.

Más: https://laravel.com/docs/5.6/eloquent#local -ámbitos

Gracias por una respuesta tan profunda. Anteriormente había mirado los ámbitos, sin embargo, no pude hacer que las relaciones funcionaran con un ámbito personalizado, es decir, Model::with('relation')->popular()->get(); Los únicos datos extraídos son del ámbito y las relaciones se pierden. ¿Esto podría tener que ver con la consulta que estoy usando?

Por lo tanto, parece haber un problema con la eliminación de las columnas seleccionadas para el resto de la consulta. Consulte stackoverflow.com/questions/29510601/… Sin embargo, la respuesta me permite hacer lo que necesito, tengo otro problema, pero está relacionado con la forma en que la pregunta anterior afecta la recuperación de relaciones junto con un alcance. Básicamente, no puede usar un grupo en un ámbito, ya que tiene que usar select('*') como solución alternativa para obtener las relaciones.

Creo que lo que podría estar buscando es eager-load- restricciones. Esto le permitirá aplicar una consulta personalizada a una relación ORM. Pero mencionaste algo allí que, si te entiendo bien, puede ser un obstáculo en ese enfoque que de otro modo sería simple.

Dijiste que hay estadísticas que deben derivarse mediante la suma de valores de varios modelos. Si su objetivo es realizar realmente la función SQL SUM, o cualquier agregado, hay algunas advertencias. La carga ansiosa de Eloquent usa declaraciones IN en consultas independientes, no JOINs. Entonces, si está realizando el agregado en una relación de una relación, resumirá todo y no necesariamente agrupará esas operaciones por padre inmediato de la manera que esperaría.

La otra cosa es que, si intenta realizar esta operación SUM en valores que abarcan varias tablas, una relación no tiene visibilidad directa en otra, y tendrá que usar el Método join(). Eso lo llevará al Query-Builder y lo sacará del mundo Eloquent y, por lo tanto, lo alejará de cualquier beneficio que sus clases de Modelo puedan haber ofrecido.