Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检查另一个表的字段状态雄辩_Php_Laravel_Eloquent - Fatal编程技术网

Php 检查另一个表的字段状态雄辩

Php 检查另一个表的字段状态雄辩,php,laravel,eloquent,Php,Laravel,Eloquent,好的,我有一个自定义字段名是\u friend 我有三张桌子 1.用户 2.工人 3.朋友们 当你猜测一个工作者属于一个用户时,一个朋友属于一个工作者 在我的查询中,我想检查工作人员是否是当前登录用户的朋友 好友模式: Schema::create('tweets', function(Blueprint $table) { $table->increments('id'); $table->integer('targetID');

好的,我有一个自定义字段名是\u friend

我有三张桌子
1.用户
2.工人
3.朋友们

当你猜测一个工作者属于一个用户时,一个朋友属于一个工作者

在我的查询中,我想检查工作人员是否是当前登录用户的朋友

好友模式:

    Schema::create('tweets', function(Blueprint $table)
    {
        $table->increments('id');
        $table->integer('targetID');
        $table->integer('ownerID');
        $table->timestamps();
    }
从模式中可以看到,targetID是工作者的朋友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

您可以将以下关系添加到您的
Worker
模型:

public function friendsNumber()
{
    return $this->hasMany('Friend','targetID')
        ->selectRaw('targetID, count(targetID) as count')
        ->where('ownerID', Auth::user()->id)
        ->groupBy('targetID');            
}
public function getIsFriendAttribute()
{
    if (!array_key_exists('friendsNumber', $this->relations)) {
        $this->load('friendsNumber');
    }
    $related = $this->getRelation('friendsNumber')->first();
    return ($related && $related->count) ? true : false;
}
现在将以下访问器添加到
Worker
模型:

public function friendsNumber()
{
    return $this->hasMany('Friend','targetID')
        ->selectRaw('targetID, count(targetID) as count')
        ->where('ownerID', Auth::user()->id)
        ->groupBy('targetID');            
}
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作为$worker){
echo$worker->name;
如果($worker->is\u friend){
echo“是你的朋友”;
}
回声“
”; }
好的,我认为这个问题(n+1问题)可以通过使用带约束的即时加载来解决

首先在工作者模型中定义朋友关系。 因此

class Worker extends Eloquent{
    ...
    // This will get all the friends
    public function friends(){
        return $this->hasMany('Friend','targetID');
    }
    ...

}
我们使用渴望加载来处理n+1问题

现在来看

@foreach ($workers as $worker)
    @if(count($worker->friends) >0)
    Your friend
    @endif
@endforeach

如何查询20个Worker?您好@MarcinNabiałek现在我正在执行
Worker::get('name')
,它将获取所有Worker表行,因为我没有使用任何限制或位置。因此,如果有20行,将输出20行,因此另外20行只是为了检查每行的状态。对于这种关系,有一个
hasManyThrough
方法,但我不确定它是否能实现您想要的。如果我能很快测试它,我会发送一个答案。以这种方式调用的
$related
上没有
count
方法-要么只检查
null
,要么不使用上面的
第一行。或者使用
hasOne
而不是当然。感谢您的回答,我有一个问题,如果我使用此选项,只会获得有朋友的工人?那些没有朋友的人呢。我想得到一个混合结果的工人是朋友与用户,而不是。如果他们是朋友,就会有一个字段来识别它。