1-larale雄辩模型查询的问题

时间:2017-08-01 12:33:42

标签: php sql laravel eloquent

我花了几个小时试图解决这个问题,我希望有人可以提供帮助......

我只是试图输出文章标题,每篇文章的平均评分。我已经设置了数据库表文章和评级来保存数据,在评级表中我有rating_id,主要和article_id作为链接到文章表[主键]的外键。

我为每个表创建了一个模型,并为Article和Rating模型创建了一个多关系:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    protected $table = 'articles';
    protected $primaryKey = 'article_id';

    /**
     * Define a 1-many relationship in eloquent
     */
    public function ratings()
    {

    return $this->hasMany(Rating::class);

    }
}

我还在评级和文章模型之间建立了反比关系(这实际上是必需的吗?):

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Rating extends Model
{
    protected $table = 'rating';
    protected $primaryKey = 'rating_id';

    /**
     * Define a 1-many inverse relationship in eloquent
     */
    public function articles()
    {

    return $this->belongsTo(Article::class);

    }
}

在我的控制器中,我通过'rating'属性调用收视率,其中article_id = 2 - 应该返回2条记录,因为这篇文章有2个评级。代码示例:

public function ShowRating() {

$ratings = Article::find(2)->ratings;

var_dump($ratings);

    }

我收到了SQL错误,我的模型关系不正确吗?代码示例:

> QueryException in Connection.php line 647: SQLSTATE[42S22]: Column not
> found: 1054 Unknown column 'rating.article_article_id' in 'where
> clause' (SQL: select * from `rating` where
> `rating`.`article_article_id` = 2 and `rating`.`article_article_id` is
> not null)

一旦我完成了这个阶段,我可以使用avg方法平均评分。

提前道歉 - 我确信这是愚蠢的,但我无法弄明白。非常感谢..

2 个答案:

答案 0 :(得分:0)

我认为你的迁移/数据库结构是错误的。 - > Unknown column 'rating.article_article_id' 如果您发布代码,我可以帮助您。

答案 1 :(得分:0)

我想发布我的工作代码,再次感谢您的帮助。

第一个问题 - 我的模型中没有为hasMany和belongsTo方法定义参数,这些方法定义了我的文章和评级表之间的关系 - 特别是表的外键/主键的定义; Laravel信息:https://laravel.com/docs/5.4/eloquent-relationships

文章模型:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    protected $table = 'articles';
    protected $primaryKey = 'article_id';

    /**
     * Define a 1-many relationship in eloquent
     */
    public function ratings()
    {

    //NOTE ignore IDE error
    return $this->hasMany(Rating::class, 'article_id');

    }
}

评级模型:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Rating extends Model
{
    protected $table = 'rating';
    protected $primaryKey = 'rating_id';

    /**
     * Define a 1-many inverse relationship in eloquent
     */
    public function articles()
    {

    return $this->belongsTo(Article::class, 'article_id');

    }
}

第二个问题是我使用预先加载来输出1-many关系而不是反向关系(即使用Rating对象)。我还在集合类上使用了一个方法来将平均值应用到我的评级中,并在控制器中输出所有内容,如下所示:

    public function GetAllRatings() {

   $ratings = Rating::all();

   $ratings->average = $ratings->avg('rating_score');

   foreach ($ratings as $rating) {
   echo $rating->articles->headline;
   echo $ratings->average;
}     
    }

我希望这可以帮助其他人在15行代码上花费不到2天的时间,但我还是要学习!!任何错误(甚至认为似乎工作正常)请告诉我,我会修改这个答案。再次感谢所有人。