Php 检查另一个表的字段状态雄辩
好的,我有一个自定义字段名是\u friend 我有三张桌子Php 检查另一个表的字段状态雄辩,php,laravel,eloquent,Php,Laravel,Eloquent,好的,我有一个自定义字段名是\u friend 我有三张桌子 1.用户 2.工人 3.朋友们 当你猜测一个工作者属于一个用户时,一个朋友属于一个工作者 在我的查询中,我想检查工作人员是否是当前登录用户的朋友 好友模式: Schema::create('tweets', function(Blueprint $table) { $table->increments('id'); $table->integer('targetID');
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
而不是当然。感谢您的回答,我有一个问题,如果我使用此选项,只会获得有朋友的工人?那些没有朋友的人呢。我想得到一个混合结果的工人是朋友与用户,而不是。如果他们是朋友,就会有一个字段来识别它。