А не проще ли будет не расскидывать одну и ту же сущность по разным таблицам? Ну то есть сделать таблицу social_users с полями user_id, social_type, token? И тогда все сведется к нормальным join?
З.Ы. В рамках ларки можно конечно поиграться со связями. Как нибудь так
public function social(){
$class = Str::camel(Str::singular($this->source));
$instance = $this->newRelatedInstance($class);
$foreignKey = 'id';
$localKey = 'field_id';
return $this->newHasOne($instance->newQuery(), $this, $instance->getTable().'.'.$foreignKey, $localKey);
}
И будет работать $model->social. Но eager loading сдохнет к херам