与多模型的laravel关系问题

user has relation with creater one to one but creater has relation with archive belongsToMany

$creatorQuery = User::query();
    $cultivator_id = 2;
    $creatorQuery = $creatorQuery->select('id', 'name', 'email', 'role');

    $creatorQuery = $creatorQuery->with('creater', function($q) {
        $q->whereHas('archive', function($q) use($cultivator_id) {
            $query->where('caltivater_id', $cultivator_id);
        });
    });

    $creators = $creatorQuery->get();

showing error mb_strpos() expects parameter 1 to be string, object given

function is supposed to be passed into creater, so you need to change your call to be a key/value array:

$creatorQuery = $creatorQuery->with(['creater' => function($q) use($cultivator_id) {
    $q->whereHas('archive', function($q) use($cultivator_id) {
        $query->where('caltivater_id', $cultivator_id);
    });
}]);

You've said you want to get users by their caltivater_id value defined in Archive model. Use nested whereHas():

$creators = User::whereHas('creator', function($q) use($cultivator_id) {
    $q->whereHas('archive', function($q) use($cultivator_id) {
        $q->where('caltivater_id', $cultivator_id);
    });
})
->with('creators')
->get();

Or use dot notation:

$creators = User::whereHas('creator.archive', function($q) use($cultivator_id) {
    $q->where('caltivater_id', $cultivator_id);
})
->with('creators')
->get();