检查另一个表是否具有雄辩的字段状态

时间:2014-12-20 14:28:50

标签: php laravel eloquent

好的,我有一个自定义字段名称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

2 个答案:

答案 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