如何在laravel雄辩中与union
建立关系?我已经尝试了两种不同的方法。
User::with(['url' => function($query) use(&$some_property) {
$favouriteUrls = \DB::table('urls')
->select('urls.*')
->join('favourite_urls', function($join) {
$join->on('favourite_urls.url_id', '=', 'urls.id');
})
->where('some_condition', '=', $some_property);
$query = $query->union($favouriteUrls);
}]);
在第一次尝试中,查询中没有任何联合。然后我尝试将逻辑移到模型中。
class User extends \Eloquent {
public function urls() {
$favouriteUrls = \DB::table('urls')
->select('urls.*')
->join('favourite_urls', function($join) {
$join->on('favourite_urls.url_id', '=', 'urls.id');
})
->where('some_condition', '=', $this->some_property);
return $this->belongsTo('Url')->union($favouriteUrls);
}
}
已成功执行,但$this->some_property
已在查询中设置为null
值。
在这种情况下,我无法创建两个单独的关系。它必须是一个与工会。我该如何解决?
答案 0 :(得分:1)
如果您将该关系称为User::with('urls')
,您将得到$this->some_property
不存在,因为该对象本身不存在。但是如果你在一个对象上调用urls()
方法,它应该可行。像这样:
$user = User::find(1);
$user->urls; // here $this->some_property should have a value
假设您从urls()
对象调用User
方法,$this->some_property
应该为您提供值。如果由于某种原因您无法直接在Eloquent模型上访问属性,则可以始终引用模型内部的attributes[]
数组。例如
// calling
$this->some_property
// should be the same as
$this->attributes['some_property']
假设users
是所有用户的表,在您的查询中,您可以使用$this->some_property
更改'users.some_property'
,并且所有内容都应按预期工作,对于每个用户,它将根据该查询进行查询属性。这是代码:
class User extends \Eloquent {
public function urls() {
$favouriteUrls = \DB::table('urls')
->select('urls.*')
->join('favourite_urls', function($join) {
$join->on('favourite_urls.url_id', '=', 'urls.id');
})
->where('some_condition', '=', 'users.some_property');
return $this->belongsTo('Url')->union($favouriteUrls);
}
}
然后只需调用这样的方法:
User::with('urls')->get();