Laravel使用联合查询的急切加载

时间:2017-06-18 00:16:32

标签: mysql laravel laravel-5 eloquent laravel-5.4

我使用union加入2个查询。在我的第一个查询中,我正在使用with雄辩的方法来急切地加载它的关系,然后在我的第二个查询中,我使用了联合来组合2.我尝试了许多不同的方法,但到目前为止都没有。

如果我只是查询$establishments,则以下所有尝试都有效。 如果我进行独立查询,所有关系都能正常工作。

尝试1

我只是添加了with方法。在我的结果中,它没有显示任何结果,它完全忽略它。

$establishemnts = Establishment::select('establishments.name', 'establishments.category_id',
        DB::raw("MATCH (establishments.name) AGAINST ('{$text}*' IN BOOLEAN MODE) as scores"),
        DB::raw("'establishment' as object_type")
    )
    ->with('category')
    ->whereRaw("MATCH (establishments.name) AGAINST ('{$text}*' IN BOOLEAN MODE)")
    ->where('status_id', Status::ACTIVE);

$query = Event::select('events.name', DB::raw('null as category_id'),
        DB::raw("MATCH (events.name) AGAINST ('{$text}*' IN BOOLEAN MODE) as scores"),
        DB::raw("'event' as object_type")
    )
    ->whereRaw("MATCH (events.name) AGAINST ('{$text}*' IN BOOLEAN MODE)")
    ->where('status_id', Status::ACTIVE)
    ->union($establishemnts)
    ->orderBy('scores', 'desc')
    ->limit(6)
    ->get();

结果

{
    "data": [
    {
        "name": "Group",
        "category_id": null,
        "scores": 6.3736681938171,
        "object_type": "event"
    },
 ...

尝试2

与尝试1相同的查询,但已添加 ->union($establishemnts->getQuery()) 我在其他一些回复中看到了。它也会返回与Attemp 1相同的结果。

尝试3

我认为,因为第一个查询返回了5个结果而第二个返回了4个,这是一个不匹配以及没有事件显示列的原因。所以我添加了DB::raw('null as category_id')作为另一列,因此它们都具有相同的数量。那也行不通。它告诉我他们有不同数量的列。

尝试4

我在第二个查询中添加了->with('promotions'),因此它们具有相同的结构。

结果4

{
"data": [
    {
        "name": "Group",
        "category_id": null,
        "scores": 6.3736681938171,
        "object_type": "event",
        "promotions": []
    },
....

对于所有结果,它给了我一个空的promotions,这是正确的,因为promotions为空。但它没有显示第一个查询的关系。就像->with('promotions')覆盖它一样。

最后的尝试

我改变了查询。查询1成为查询2并在第二个查询上执行连接。这给我带来了正确的关系,但让我想到当我想急切加载两个查询时会发生什么?似乎第二个eager加载器总是替换,或者第一个查询与eager loader永远不会被执行。

1 个答案:

答案 0 :(得分:0)

假设一个企业可以有很多活动,一个活动可以在一个以上的企业举行,每个模型都需要设置为具有多对多的关系。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Establishment extends Model
{
    /**
     * The events that belong to the establishment.
     */
    public function events()
    {
        return $this->belongsToMany('App\Event');
    }
}

和逆:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Event extends Model
{
    /**
     * The establishments that belong to the event.
     */
    public function roles()
    {
        return $this->belongsToMany('App\Establishment');
    }
}

定义关系后,您可以使用with方法急切加载:

$establishments = Establishment::with('events')->get();