【问题标题】:Laravel Eloquent hasMany condition in parent tableLaravel Eloquent hasMany 父表中的条件
【发布时间】:2016-03-24 08:19:54
【问题描述】:

我有这些表:

  1. places
    • id
    • name
    • address
  2. users
    • id
    • name
    • email
  3. reviews
    • id
    • place_id
    • user_id
    • title
    • review
    • as_anoniem

即使as_anoniem1user_id 也会被填充。

现在我想要所有placesuser 的所有reviews,除了as_anoniem = 1 的那些。

类似这样的:

Place::with(['review' => function ($query) {
    return $query->with('user')->where('as_anoniem', 1);
}]);

这并不完全正确,因为它只返回 reviewsas_anoniem = 1

如何使用 实现这一目标?

【问题讨论】:

  • 什么!我回答完你就换了问题,你的问题是什么?
  • @TheAlpha,是的,很抱歉先告诉你。第一个问题不够清楚。

标签: eloquent php laravel eloquent


【解决方案1】:

你可以试试这个:

$users = \App::User::with('reviews' => function($query) {
    $query->where('as_anoniem', '!=', 1);
})->get();

这将要求您在App\User 模型中创建one-to-many 关系,例如:

// App\User.php
public function reviews()
{
    // namespace: App\Review
    return $this->hasMany(Review::class);
}

假设UserReview的命名空间是App,它们在同一个目录中。

在原来的问题被OP更改后更新:

$places = \App::Place::with('reviews' => function($query) {
    $query->with('user')->where('reviews.as_anoniem', '!=', 1);
})
->get();

放置模型:

public function reviews()
{
    // namespace: App\Review
    return $this->hasMany(Review::class);
}

审查模型:

public function user()
{
    // namespace: App\User
    return $this->belongsTo(User::class);
}

【讨论】:

  • 我已经回答了你的问题,但现在你改变了问题,这是不对的。
  • 这不起作用,因为它只会给出 as_anoniem=1 的评论。我想要所有评论,但只有没有 as_anoniem=1 的评论的用户。
  • 这假设可以工作,因为as_anoniem 字段在reviews 表中,并且我使用了正确的代码:$query->with('user')->where('as_anoniem', '!=', 1); 所以它应该可以工作,确保你没有做任何错误。
  • where 适用于评论,因此它不会显示所有匿名评论。你明白我的意思吗? sql 将类似于 where as_anoniem != 1 但我想要所有评论。
  • 是的,我确实做到了,where('reviews.as_anoniem', '!=', 1) 意味着将所有评论都交给用户,其中review.as_anoniem 不是1
【解决方案2】:

可以在条件下使用模型的值:

class Content extends Model
{

    // ...

    /**
     * Get linked content
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function linked()
    {
        return $this->hasMany(self::class, 'source_content_id', 'source_content_id')
            ->where('source_content_type_id', '=', $this->source_content_type_id)
            ->where('id', '<>', $this->id);
    }
}

【讨论】:

  • 这种情况不适用于预加载
【解决方案3】:

您可以查看此链接https://stackoverflow.com/a/18600698/16237933

class Game extends Eloquent {
    // many more stuff here

    // relation without any constraints ...works fine 
    public function videos() {
        return $this->hasMany('Video');
    }

    // results in a "problem", se examples below
    public function available_videos() {
        return $this->videos()->where('available','=', 1);
    }
}

【讨论】:

  • 这绝不是一个好的答案,因为您将粘贴代码从一个问题复制到另一个问题......在这种情况下,只需将原始问题标记为重复。不过,它不是重复的......只需使用作者代码而不是从上下文中复制代码......
猜你喜欢
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2016-03-17
  • 2017-11-21
  • 2018-05-28
  • 2021-10-13
相关资源
最近更新 更多