【问题标题】:laravel 4 across 2 Eloquent with scopelaravel 4 across 2 Eloquent with scope
【发布时间】:2014-05-30 20:42:43
【问题描述】:

我是 Laravel 新手,感谢您的帮助

我有两个 Eloquent 模型,Job 和 User

工作模式如下:

<?php
class Job extends Eloquent {

  protected $table = 'tbl_jobs';

  public function User() {
    return $this->belongsTo('User','uid');
  }

  public function scopeWork($query) {
    return $query->where('worktime', '=', 0); 
  }
}

用户模型是:

<?php

use Illuminate\Auth\UserInterface;

class User extends Eloquent implements UserInterface {
  protected $table = 'tbl_users';

  public function scopeActive($query) {
    return $query->where('status', '=', 'Active'); 
  }
}

问题是如何在一个语句中调用具有范围(活动和工作)的两个模型? 或类似的东西

    Job::Work()->with('user')->get();

是不是belongsTo不等于inner join??

【问题讨论】:

  • 不,with() 没有加入任何东西。所以问题是:您是要获取模型交集(Job scope AND User scope)还是在范围内获取 Job,然后添加与范围匹配的相关用户(如果不匹配则不添加)-后者可能会导致 Job没有用户,而先不能
  • 谢谢你,deczo,我想获得工作范围和活动范围的模型交集,这意味着我想获得 tbl_jobs.worktime = 0 和 tbl_users.status = 'active',我该怎么做做什么?

标签: model laravel eloquent


【解决方案1】:

对于十字路口,你需要这个:

Job::work()     // apply scope on jobs
  ->whereHas('user', function ($q) {
    // apply users scope to get only jobs with active users
    $q->active();

})->with(['users' => function ($q) {
    // apply scope on users' eager loading to load only active 
    $q->active();

})->get();

【讨论】:

  • WhereHas - 不使用索引,我们可以使用 Join 代替吗?
  • 如果您看到需要 b/c 的性能问题,请使用join。 Eloquent whereHas 和其他一些糖果只是为了让你的生活更轻松,代码更便携,但有时你肯定会注意到缺点,那就是性能更差。
猜你喜欢
  • 1970-01-01
  • 2017-04-01
  • 2013-05-27
  • 2020-07-09
  • 1970-01-01
  • 2021-09-08
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多