好的,我有一个自定义字段名称is_friend
我有3张桌子
1.用户
2.工人
3.朋友
正如您猜测某个工人属于某个用户,一个朋友属于一个工人。
我的查询,我想检查一名工人是否当前登录用户的朋友
朋友架构:
Schema::create('tweets', function(Blueprint $table)
{
$table->increments('id');
$table->integer('targetID');
$table->integer('ownerID');
$table->timestamps();
}
从架构中可以看出,targetID是worker的friend id,ownerID是登录用户。
我的查询:
$worker = Worker::get('name');
在我的工人模型中
class Worker extends Eloquent{
protected $appends = array('is_friend');
public function user(){
return $this->belongsTo('user');
}
public function getIsFriendAttribute(){
if(Friend::where('targetID', $this->attributes['id'])
->where('ownerID', Auth::user()->id)->first()){
return true;
} else {
return false;
}
}
}
我正在使用自定义访问器来获取此自定义字段。 它有效,但它非常难看,如果我查询20名工作人员,将会有 20个查询来检查此状态。
在视图中,我可以访问
@if($worker->is_friend)
Your friend
@endif
答案 0 :(得分:1)
您可以为Worker
模型添加以下关系:
public function friendsNumber()
{
return $this->hasMany('Friend','targetID')
->selectRaw('targetID, count(targetID) as count')
->where('ownerID', Auth::user()->id)
->groupBy('targetID');
}
现在将以下访问者添加到Worker
模型中:
public function getIsFriendAttribute()
{
if (!array_key_exists('friendsNumber', $this->relations)) {
$this->load('friendsNumber');
}
$related = $this->getRelation('friendsNumber')->first();
return ($related && $related->count) ? true : false;
}
现在你应该能够使用:
$ workers = Worker :: with('friendNumber') - > get();
foreach ($workers as $worker) {
echo $worker->name;
if ($worker->is_friend) {
echo " is your friend";
}
echo "<br />";
}
答案 1 :(得分:1)
好的我认为这个问题(n + 1问题)可以使用带有约束的急切加载来解决。
首先在工人模型中定义朋友关系。 就这样
class Worker extends Eloquent{
...
// This will get all the friends
public function friends(){
return $this->hasMany('Friend','targetID');
}
...
}
我们使用急切加载来处理n + 1问题。 Click here and scroll down to Eager Load Constraints for documentation
// We use Eager loading constraints so that only two db queries are executed instead of n+1
$workers = Worker::with(array('friends' => function($query)
{
// So we constraint the ownerId to be current user id
$query->where('ownerID', Auth::user()->id);
}))->get();
现在在视图
上@foreach ($workers as $worker)
@if(count($worker->friends) >0)
Your friend
@endif
@endforeach