محسن مهری
4 سال پیش توسط محسن مهری مطرح شد
2 پاسخ

سوال در مورد ساخت توابع در modal

درود این مدال من با نام tag هستش :

class Tag extends Model
{
    protected $fillable=['tag','foreign_id','usage'];
    protected $casts=['tags'=>'array'];
    public $timestamps=false;

    public function TagSentences(){
        return $this->whereUsage('sentence');
    }

    public function TagStartLetter($key){
        return $this->where('tag', 'like', $key.'%');
    }

    public function TagWords(){
        return $this->whereUsage('word');
    }
}

حالا چرا خط کد زیرم جواب نمیده :

 $object=new Tag();
       // return $object->TagWords()->get();    //worked
       // return $object->TagStartLetter('a')->get();       //worked
       // return $object->TagWords()->TagStartLetter('s')->get();     // not worked

یعنی نمیتونم توابع رو روی هم فراخونی کنم ؟ درصورتی که مشکلی نباید داشته باشه چون انگار دو تا where رو پشت سر هم فراخونی میکنم؟
پیشاپیش ممنونم


ثبت پرسش جدید
فخرالدین لنگی
تخصص : برنامه نویس وب، آندروید و سیست...
@fakhraddin 4 سال پیش مطرح شد
1

با سلام و درود
شما به جای این توابع بهتره از scope استفاده کنی که راحت تره و طبق یک اصولی مثلا به جای این تابع

public function TagStartLetter($key){
        return $this->where('tag', 'like', $key.'%');
    }

خیلی راحت می تونی بنویسی

public function scopeTagStartLetter($query, $key){
      return $query->where('tag', 'like', $key.'%');
}

و هر جا نیاز داشتی استفاده کنی

Tag::tagStartLetter('s')->get();

بازم سوالی بود یا کمکی لازم داشتید بفرمایید


محمد امیری
تخصص : backend coder
@mohammadeng3731 4 سال پیش آپدیت شد
1

سلام.
نبایدم جواب بده چون در انتهای tagwords باید $this رو return کنید

class fakeString
{
    private $str;
    function __construct()
    {
        $this->str = "";
    }

    function addA()
    {
        $this->str .= "a";
        return $this;
    }

    function addB()
    {
        $this->str .= "b";
        return $this;
    }

    function getStr()
    {
        return $this->str;
    }
}

$a = new fakeString();

echo $a->addA()->addB()->getStr();

This outputs "ab"

فخرالدین لنگی
تخصص : برنامه نویس وب، آندروید و سیست...
@fakhraddin 4 سال پیش مطرح شد
1

با سلام و درود
شما به جای این توابع بهتره از scope استفاده کنی که راحت تره و طبق یک اصولی مثلا به جای این تابع

public function TagStartLetter($key){
        return $this->where('tag', 'like', $key.'%');
    }

خیلی راحت می تونی بنویسی

public function scopeTagStartLetter($query, $key){
      return $query->where('tag', 'like', $key.'%');
}

و هر جا نیاز داشتی استفاده کنی

Tag::tagStartLetter('s')->get();

بازم سوالی بود یا کمکی لازم داشتید بفرمایید


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام