Laravel 模型函数内的联合
Laravel union within model functions
你好,我是新来的,母语不是英语,所以请原谅我在语法和问题格式上的任何错误。
我正在用 php 使用 laravel 框架 5.4 版本构建一个应用程序。
该 Web 应用程序非常简单,用于查看文章和发布文章的用户。
我想了解如何在我的模型中合并函数的结果。
我希望 allReviews 函数从用户模型到 return 用户的评论与他的文章按创建时间排序的评论混合在一起。
让我解释得更好。
这是我的 3 个主要表格:
Users | Articles | Reviews
--------- | --------- | ---------
id | id | id
name | user_id | reviewable_id
email | title | reviewable_type
password | body | reviewtext
etc.. | etc.. | created_time
这是我的模型代码:
class User extends Model{
protected $table = 'users';
public function articles()
{
return $this->hasMany(Article::class,'user_id');
}
public function reviews(){
return $this->morphMany(Review::class,'reviewable');
}
public function allReviews(){
/*
i want union something like this:
$result = $this->reviews() union
foreach ($this->Articles() as $Article) {
union $Article->reviews();
}
orderby created_time ASC or DESC doesn't matter
return $result
*/
}
}
class Article extends Model{
protected $table = 'articles';
public function user()
{
return $this->belongsTo(User::class,'user_id');
}
public function reviews(){
return $this->morphMany(Review::class,'reviewable');
}
}
class Review extends Model{
protected $table = 'reviews';
public function reviewable(){
return $this->morphTo('reviewable');
}
}
所以我的问题是如何让用户的 allReviews 功能正常工作?
感谢任何帮助:)
谢谢
调用 $user->reviews 属性 将 return 所有可审查的模型。您不必 UNION 任何东西,Eloquent 会为您处理。
试试这个:
public function allReviews(){
$reviews = new \Illuminate\Database\Eloquent\Collection;
foreach($this->articles as $article)
{
$reviews = $reviews->merge($article->reviews);
}
$reviews = $reviews->merge($this->reviews);
return $reviews;
}
我现在真的很累,我觉得你可能会遇到 N+1 查询问题,但它应该适合你。
你好,我是新来的,母语不是英语,所以请原谅我在语法和问题格式上的任何错误。
我正在用 php 使用 laravel 框架 5.4 版本构建一个应用程序。 该 Web 应用程序非常简单,用于查看文章和发布文章的用户。
我想了解如何在我的模型中合并函数的结果。 我希望 allReviews 函数从用户模型到 return 用户的评论与他的文章按创建时间排序的评论混合在一起。
让我解释得更好。
这是我的 3 个主要表格:
Users | Articles | Reviews
--------- | --------- | ---------
id | id | id
name | user_id | reviewable_id
email | title | reviewable_type
password | body | reviewtext
etc.. | etc.. | created_time
这是我的模型代码:
class User extends Model{
protected $table = 'users';
public function articles()
{
return $this->hasMany(Article::class,'user_id');
}
public function reviews(){
return $this->morphMany(Review::class,'reviewable');
}
public function allReviews(){
/*
i want union something like this:
$result = $this->reviews() union
foreach ($this->Articles() as $Article) {
union $Article->reviews();
}
orderby created_time ASC or DESC doesn't matter
return $result
*/
}
}
class Article extends Model{
protected $table = 'articles';
public function user()
{
return $this->belongsTo(User::class,'user_id');
}
public function reviews(){
return $this->morphMany(Review::class,'reviewable');
}
}
class Review extends Model{
protected $table = 'reviews';
public function reviewable(){
return $this->morphTo('reviewable');
}
}
所以我的问题是如何让用户的 allReviews 功能正常工作?
感谢任何帮助:) 谢谢
调用 $user->reviews 属性 将 return 所有可审查的模型。您不必 UNION 任何东西,Eloquent 会为您处理。
试试这个:
public function allReviews(){
$reviews = new \Illuminate\Database\Eloquent\Collection;
foreach($this->articles as $article)
{
$reviews = $reviews->merge($article->reviews);
}
$reviews = $reviews->merge($this->reviews);
return $reviews;
}
我现在真的很累,我觉得你可能会遇到 N+1 查询问题,但它应该适合你。