基本上,我有一个Followers表,其中存储了user_id和followable_id。例如,如果用户A跟随用户B,则会创建一条记录。如果B跟在A之后,则创建一个新记录。仅当A跟随B时我才需要返回结果,但是如果B也跟随A则不返回任何内容。
我尝试了各种解决方案,但没有一个可行。也许有人可以指出我正确的方向。
编辑: 但这有效,但是它很丑陋,我想避免这种情况:
$iFollows = Followers::where('user_id', '=', $currentUser->id)->get();
$myFollowers = Followers::where('followable_id', '=', $currentUser->id)->get();
foreach($myFollowers as $key => $value){
foreach($iFollows as $iFollow){
if($value->user_id == $iFollow->followable_id){
$myFollowers->forget($key);
}
}
}
数据库结构:
除了使用laravel查询生成器外,是否有办法实现相同的目的?
用户实现称为“可追踪”的特征
trait Followable
{
/**
* Collection of followers attached to this object
*
* @return Query|Collection
*/
public function followers()
{
return $this->morphToMany(
User::class, // related
'followable', // name
'followers', // table
'followable_id', // foreignKey
'user_id' // otherKey
)->where('status', 1)->withPivot('created_at', 'updated_at');
}
/**
* @return mixed
*/
public function followings()
{
return $this->morphToMany(
User::class, // related
'followable', // name
'followers', // table
'user_id', // foreignKey
'followable_id' // otherKey
)->where('status', 1)->withPivot('created_at', 'updated_at');
}
答案 0 :(得分:0)
好的,我终于用这种方法解决了我的问题:
/**
* Class FollowableTrait
* @package App\Traits
*/
trait Followable
{
/**
* @param array $ids
* @return mixed
*/
public function newFollowers($ids)
{
return $this->morphToMany(
User::class, // related
'followable', // name
'followers', // table
'followable_id', // foreignKey
'user_id' // otherKey
)->where('status', 1)->whereNotIn('user_id', $ids)->withPivot('created_at', 'updated_at');;
}
然后在我的控制器中
$ids = $currentUser->followings()->pluck('followable_id')->toArray();
$newFollowers = $currentUser->newFollowers($ids)->get();