我正在使用union连接2个查询。在我的第一个查询中,我使用with
雄辩的方法来急切地加载它的关系,然后在我的第二个查询中,我使用ign join来组合2。我尝试过许多不同的方法,但迄今为止没有一种有效。
如果我只是查询$机构
,以下所有尝试都会起作用。如果我进行独立查询,所有关系都能正常工作。
尝试1
我只是用方法添加了。在我的结果中,它没有显示任何结果,它完全忽略了它。
$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相同的查询,但添加了-
尝试3
我认为由于第一个查询返回5个结果,第二个返回4个结果,这是不匹配的,也是不显示列的原因。所以我添加了DB::ra('null ascategory_id')
作为另一列,所以它们的数量相同。那也没用。它告诉我他们有不同数量的列。
尝试4
我添加了一个-
结果4
{
"data": [
{
"name": "Group",
"category_id": null,
"scores": 6.3736681938171,
"object_type": "event",
"promotions": []
},
....
对于所有的结果,它给了我一个空的促销
,这是正确的,因为促销
是空的。但是它没有显示第一个查询的关系。就像<代码>-
最后的尝试
我交换了询问。查询1变成了查询2,并在第二个查询上执行连接。这给我带来了正确的关系,但让我思考当我想渴望加载两个查询时会发生什么?似乎第二个急切加载器总是替换,或者第一个带有急切加载器的查询永远不会执行。
假设一个机构可以有许多活动,并且一个活动可以在多个机构举行,则每个模型都需要设置为具有多对多关系。
<?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');
}
}
一旦定义了关系,您就可以使用和
方法进行加载:
$establishments = Establishment::with('events')->get();