मैंने अपने कुछ मॉडलों में एक मॉडल से दूसरे मॉडल से अप्रत्यक्ष संबंध बनाए हैं।

यह मेरा Work मॉडल है:

public function GeoEntities()
{
    return $this->hasMany(\App\GeoEntity::class);
}

public function geoLand()
{
    $builder = $this->GeoEntities()->where("entity_type", 0);
    $relation = new HasOne($builder->getQuery(), $this, 'work_id', 'id');
    return $relation;
}

public function geoLandPoints()
{
    return $this->geoLand->geoPoints();
}

यह return $this->intermediateModel->FinalModel(); काम करेगा, अगर मध्यवर्ती संबंध संबंधित है() है और एक संबंध उदाहरण देता है।

लेकिन इस मामले में, जब geoLand खाली होता है तो यह त्रुटि उत्पन्न करता है:

किसी सदस्य फ़ंक्शन को कॉल करें geoPoints() शून्य पर

नीचे की रेखा की तरह:

$points = $work->geoLandPoints;
  • मध्यवर्ती संबंध एक कई हैं

मैं इस तरह के संबंध कॉल geoLandPoints चाहता हूं और geoLandPoints() नहीं, लेकिन,

जब मध्यवर्ती मॉडल शून्य होते हैं, तो मुझे एक खाली संबंध चाहिए।

लेकिन मैं यह नहीं समझ सकता कि इसे कैसे प्राप्त किया जाए।

साथ में Fico7489\Laravel\EloquentJoin\Traits\EloquentJoin

Fico7489\Laravel\EloquentJoin\Traits\EloquentJoin पैकेज का उपयोग करके, मैंने नीचे दिए गए संबंध को दोबारा करने की कोशिश की है:

public function geoLandPoints()
{
    $builder = $this
        ->select("works.*")
        ->join("geo_entities", "works.id", "geo_entities.work_id")
        ->join("geo_points", "geo_entities.id", "geo_points.geo_entity_id")
        ->where("entity_type", 0)
        ->where("works.id", $this->id);
    return new HasMany($builder->getQuery(), $this, "work_id", "id");
}

लेकिन यह डेटाबेस क्वेरी बिल्डर को वाक्पटु क्वेरी बिल्डर में परिवर्तित नहीं कर सका।

Illuminate\Database\Eloquent\Relations\HasOneOrMany::__construct() को दिया गया तर्क 1 Illuminate\Database\Eloquent\Builder का एक उदाहरण होना चाहिए, Illuminate\Database\Query\Builder का उदाहरण दिया गया

0
Abilogos 4 फरवरी 2021, 20:32

1 उत्तर

सबसे बढ़िया उत्तर

आप अपनी खुद की HasOne कक्षा वापस करने की कोशिश करने के बजाय hasOne() पद्धति का उपयोग क्यों नहीं करते? साथ ही, आप withDefault() का उपयोग कर सकते हैं ताकि संबंध null के बजाय एक खाली GeoEntity लौटाए।

public function geoLand()
{
    return $this->hasOne(\App\GeoEntity::class)->where("entity_type", 0)->withDefault();
}

आप डिफ़ॉल्ट मानों की एक सरणी भी पास कर सकते हैं। withDefault(['column' => 'value', 'column2' => 'value2', ...])

1
IGP 10 फरवरी 2021, 04:33
इस स्थिति में withDefault का उपयोग करना और hasOne का उपयोग करना एक अच्छी तकनीक है। धन्यवाद
 – 
Abilogos
10 फरवरी 2021, 13:37