【问题标题】:Laravel 5.1 - Merge multiple Eloquent queries and sort by timestampLaravel 5.1 - 合并多个 Eloquent 查询并按时间戳排序
【发布时间】:2015-09-17 17:12:57
【问题描述】:

我有三个表,一个用户表、一个工作表和一个投标表。用户可以发布多个职位,并且用户可以对不属于他们的职位出价。

我的目标:我正在尝试查询 Jobs 表以查找用户的所有工作,并查询 Bids 表以获取用户竞标的所有工作。然后我想根据时间戳对工作和出价进行排序并返回工作 ID

表格设置如下:

| USERS    | JOBS    | BIDS
| id       | id      | id
| username | user_id | user_id
| password | title   | job_id
|          |         | bid_amount

表之间的关系如下:

工作:

public function bids()
{
    return $this->hasMany('App\RocketCandy\Repos\Bids\Bid');
}

public function user()
{
    return $this->belongsTo('App\RocketCandy\Repos\Users\User');
}

用户:

public function jobs()
{
    return $this->hasMany('App\RocketCandy\Repos\Jobs\Job');
}

public function bids()
{
    return $this->hasMany('App\RocketCandy\Repos\Bids\Bid');
}

出价:

public function jobs()
{
    return $this->belongsTo('App\RocketCandy\Repos\Jobs\Job');
}

public function users()
{
    return $this->belongsTo('App\RocketCandy\Repos\Users\User');
}

我开发的以下代码返回作业和出价,但它不够聪明,无法根据 updated_at 时间戳对 ID 进行排序。

public function getUsersJobs($userId)
{
    // Get the jobs that the user posted
    $postedJobs = Job::where('user_id', $userId)
                       ->lists('id')
                       ->toArray();

    // Get the jobs that the user is bidding on
    $biddedJobs = Job::with('bids')
                       ->whereHas('bids', function ($q) use ($userId) {
                           $q->where('user_id', $userId);
                       })->lists('id')
                         ->toArray();

    $jobIds = array_merge($postedJobs, $biddedJobs);

    // Return the jobs that a user has posted and is bidding on
    return Job::whereIn('id', $jobIds)
                       ->OrderBy('updated_at', 'DESC')
                       ->get();
}

【问题讨论】:

  • orderBy 子句的错字?它应该是 ->orderBy 不是 ->OrderBy
  • 好的有效点,但答案呢?
  • 对不起,我没有得到你想要在这里实现的目标。那么,您在修正错字后编写的代码缺少什么?它仍然没有对 ID 进行排序吗?
  • 所以基本上我想获取用户通过 id 发布的所有工作。我想获取用户通过 job_id 进行的所有出价。将它们全部返回给用户(这样他就可以看到投标和发布的工作的组合视图),但根据“updated_at”时间戳对它们进行排序

标签: php mysql laravel eloquent


【解决方案1】:

我认为你可以通过从用户而不是工作来查看它来简化它:

$jobs = User::where('user_id', $userId)->jobs;
$bids = User::where('user_id', $userId)->bids;

$all = $jobs->toBase()->merge($bids)->sortByDesc('updated_at');

foreach ($all as $thing) {
    dump($thing->id);
    dump($thing->updated_at);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2017-11-08
    • 2018-11-10
    • 2016-02-17
    相关资源
    最近更新 更多