সম্পর্কিত মডেল উপস্থিত থাকলে লারাভেল চেক করুন


151

আমার একটি স্পষ্ট মডেল রয়েছে যার সম্পর্কিত মডেল রয়েছে:

public function option() {
    return $this->hasOne('RepairOption', 'repair_item_id');
}

public function setOptionArrayAttribute($values)
{
    $this->option->update($values);
}

আমি যখন মডেলটি তৈরি করি তখন এটির সাথে সম্পর্কিত মডেলটি অগত্যা হয় না। আমি যখন এটি আপডেট করি তখন আমি একটি বিকল্প যুক্ত করতে পারি, না।

সুতরাং আমাকে যথাযথভাবে আপডেট করতে বা এটি তৈরি করতে যথাক্রমে সম্পর্কিত মডেলটি উপস্থিত আছে কিনা তা পরীক্ষা করে দেখতে হবে:

$model = RepairItem::find($id);
if (Input::has('option')) {
    if (<related_model_exists>) {
        $option = new RepairOption(Input::get('option'));
        $option->repairItem()->associate($model);
        $option->save();
        $model->fill(Input::except('option');
    } else {
       $model->update(Input::all());
    }
};

কোথায় <related_model_exists>কোড আমি খোঁজ করছি হয়।


3
দুর্দান্ত প্রশ্ন আপনাকে ধন্যবাদ! এবং নীচের ছেলেদের দুর্দান্ত উত্তর। আমার প্রকল্পে আমার সময় বাঁচিয়েছে।
রাফায়েল 0

উত্তর:


197

ইন পিএইচপি 7.2+ আপনি ব্যবহার করতে পারবেন না countসম্পর্ক বস্তুর উপর, তাই কেউ-তড়কা সব সব সম্পর্ক জন্য পদ্ধতি আছে। পরিবর্তে @ ট্রেব্বি হিসাবে ক্যোয়ারী পদ্ধতিটি ব্যবহার করুন:

$model->relation()->exists()

সমস্ত সম্পর্কের ধরণের উপর জেনেরিক সমাধান কাজ করছে ( প্রাক পিএইচপি 7.2 ):

if (count($model->relation))
{
  // exists
}

গতিশীল বৈশিষ্ট্য ফিরে আসার পরে Modelবা এটি প্রতিটি সম্পর্কের জন্য কাজ করবে Collection। উভয়ই প্রয়োগ করে ArrayAccess

সুতরাং এটি এর মত যায়:

একক সম্পর্ক: hasOne / belongsTo/ morphTo/morphOne

// no related model
$model->relation; // null
count($model->relation); // 0 evaluates to false

// there is one
$model->relation; // Eloquent Model
count($model->relation); // 1 evaluates to true

অনেকগুলি সম্পর্ক: hasMany / belongsToMany/ morphMany/ morphToMany/morphedByMany

// no related collection
$model->relation; // Collection with 0 items evaluates to true
count($model->relation); // 0 evaluates to false

// there are related models
$model->relation; // Collection with 1 or more items, evaluates to true as well
count($model->relation); // int > 0 that evaluates to true

1
পুরো জিনিস পড়ুন। count($relation)সমস্ত সম্পর্কের জন্য একটি সাধারণ সমাধান। এটা তোলে জন্য কাজ করবে Modelএবং Collectionযখন Modelকোন হয়েছে ->count()পদ্ধতি।
জেরেক টাকাসেক

7
পছন্দ করেছেন Collectionএর নিজস্ব পদ্ধতি রয়েছে isEmpty, তবে জেনেরিক emptyফাংশন কোনও জিনিসের জন্য মিথ্যা প্রত্যাবর্তন করে (এভাবে খালি সংগ্রহের জন্য কাজ করবে না)।
জেরেক টাকাসেক

1
count($model->relation)morphToসম্পর্কের কোনও সমিতি স্থাপনের সময় কাজ হয়নি had বিদেশী আইডি এবং প্রকারটি শূন্য এবং লারাভেল দ্বারা নির্মিত ডিবি কোয়েরি বোগাস এবং ব্যতিক্রম বেড়েছে। আমি $model->relation()->getOtherKey()একটি workaround হিসাবে ব্যবহার ।
জোসলিন

1
@ জোসলিন হ্যাঁ, এটি স্পষ্টত বাগ। দুর্ভাগ্যক্রমে পলিমারফিক সম্পর্কের জন্য তাদের মধ্যে কমপক্ষে কয়েকটি রয়েছে, সুতরাং স্পষ্টতই আপনি কোনওভাবেই তাদের উপর নির্ভর করতে পারবেন না।
জারেক টাকাকজেক

2
এটি পিএইচপি 7.2 এ ফিরে আসবে, ফিরে আসবে:count(): Parameter must be an array or an object that implements Countable
কোডগোডি

81

রিলেশন অবজেক্ট একটি অলৌকিক জিজ্ঞাসা বিল্ডারের কাছে অজানা পদ্ধতি কলগুলি অতিক্রম করে , যা কেবলমাত্র সম্পর্কিত অবজেক্ট নির্বাচন করার জন্য সেট আপ করা হয়। সেই নির্মাতাকে তার অন্তর্নিহিত কোয়েরি বিল্ডারে অজানা পদ্ধতি কলগুলি অতিক্রম করে ।

এর অর্থ আপনি কোনও সম্পর্ক সম্পর্কিত অবজেক্ট থেকে সরাসরি exists()বা count()পদ্ধতিগুলি ব্যবহার করতে পারেন :

$model->relation()->exists(); // bool: true if there is at least one row
$model->relation()->count(); // int: number of related rows

এর পরে প্রথম বন্ধনীগুলি নোট করুন relation: ->relation()এটি একটি ফাংশন কল (রিলেশন অবজেক্টটি পাওয়া), ->relationযার বিপরীতে ল্যারাভেল (সম্পর্কিত অবজেক্ট / অবজেক্টগুলি পাওয়ার জন্য) আপনার জন্য একটি যাদু সম্পত্তি অর্জনকারী স্থাপন করেছে।

countসম্পর্কের অবজেক্টে পদ্ধতিটি ব্যবহার করা (এটি, প্রথম বন্ধনীর সাহায্যে করা) করণ করা $model->relation->count()বা count($model->relation)(যতক্ষণ না সম্পর্কটি ইতিমধ্যে উত্সাহিত-লোড না করা হয়) এর চেয়ে বেশি দ্রুত হবে কারণ এটি কোনও সম্পর্কিত সামগ্রীর জন্য সমস্ত ডেটা টানানোর পরিবর্তে একটি গণনা কোয়েরি চালায় since ডাটাবেস থেকে, কেবল তাদের গণনা করতে। তেমনি, ব্যবহার করেও existsমডেল ডেটা টানতে হবে না।

উভয় exists()এবং count(), সব সম্পর্ক ধরনের আমি চেষ্টা করেছি কাজ তাই অন্তত belongsTo, hasOne, hasMany, এবং belongsToMany


লুমানে বিদ্যমান নেই, কেন তা নিশ্চিত নয়।
ব্রিঙ্কিপ

@ ব্রায়ানকিপ - এটি করা উচিত। আপনি কি নিশ্চিত যে আপনি (যাদু সম্পত্তি ব্যবহার করে) সংগ্রহের পরিবর্তে সম্পর্কের বিষয়টি (পদ্ধতিটি কল করে) পেয়ে যাচ্ছেন?
কাঁপানো

18

আমি existsপদ্ধতি ব্যবহার করতে পছন্দ করি :

RepairItem::find($id)->option()->exists()

সম্পর্কিত মডেল রয়েছে কিনা তা যাচাই করতে। এটি লারাভেল 5.2-তে দুর্দান্ত কাজ করছে


1
+1 টি; সম্পর্কের টেবিলে কোনও আইটেম না থাকলেও কাউন্ট ($ মডেল-> সম্পর্ক) লারাভেল 5.2-এ আমার জন্য সত্য ফিরে আসছিল। -> উপস্থিত () কৌশলটি করে।
বেন উইলসন

9

পিএইচপি 7.1 এর পরে , গৃহীত উত্তরটি সব ধরণের সম্পর্কের জন্য কাজ করবে না।

কারণ সম্পর্কের ধরণের উপর নির্ভর করে এলিউলিউড ফিরে আসবে a Collection, a Modelবা Null। এবং পিএইচপি 7.1 এ count(null) একটি নিক্ষেপ করবে error

সুতরাং, সম্পর্কটি বিদ্যমান কিনা তা পরীক্ষা করতে আপনি ব্যবহার করতে পারেন:

একক সম্পর্কের জন্য: উদাহরণস্বরূপ hasOneএবংbelongsTo

if(!is_null($model->relation)) {
   ....
}

একাধিক সম্পর্কের জন্য: উদাহরণস্বরূপ: hasManyএবংbelongsToMany

if ($model->relation->isNotEmpty()) {
   ....
}

4

এটি লারাভেল 5-এ পরিবর্তিত হয়েছে কিনা তা নিশ্চিত নন, তবে count($data->$relation)সম্পর্কের সম্পত্তি অ্যাক্সেস করার খুব কার্যকর কাজ এটি লোড হওয়ার কারণ হিসাবে ব্যবহার করে গ্রহণযোগ্য উত্তরটি আমার পক্ষে কাজ করে না।

শেষ পর্যন্ত, একজন সরল ব্যক্তি isset($data->$relation)আমার জন্য কৌশলটি করেছিলেন।


আমি বিশ্বাস করি এটি $data->relationছাড়াই $(সম্পাদনা করতে পারে না, কারণ 6 অক্ষরের সীমা)
জাংশিন 13

2
আহ $relationহ'ল আপনার সম্পর্কের নাম, যেমন $data->postsবা এর মতো। দুঃখিত যদি এটি বিভ্রান্তিকর হয়, আমি এটি পরিষ্কার করতে চেয়েছিলাম যে relationকোনও কংক্রিট মডেল সম্পত্তি ছিল না: পি
ডেভ স্টুয়ার্ট

এটি কিছুক্ষণের জন্য কাজ করছিল, তবে আমি লারাভেলকে 5.2.29 থেকে 5.2.45 এ আপডেট করার পরে এটি কাজ করা বন্ধ করে দিয়েছে। কোনও ধারণা কেন বা কীভাবে এটি ঠিক করবেন? এটি এখন কোনও কারণে রিলেশনাল ডেটা লোড করার কারণ ঘটায়।
অ্যান্টনি

আমি একটি উত্তর যুক্ত করেছি যা এর জন্য একটি ঠিক আছে।
অ্যান্টনি

3

আপনি মডেল অবজেক্টে রিলেটিশলিড পদ্ধতি ব্যবহার করতে পারেন । এটি আমার বেকন সংরক্ষণ করেছে তাই আশা করি এটি অন্য কাউকে সহায়তা করে। আমি যখন ল্যারাকাস্টে একই প্রশ্ন জিজ্ঞাসা করেছি তখন আমাকে এই পরামর্শ দেওয়া হয়েছিল ।


2

হিসাবে Hemerson Varela ইতিমধ্যে পিএইচপি 7.1 বলেন count(null)একটি নিক্ষেপ করা হবে errorএবং hasOneআয় nullযদি কোনো সারি বিদ্যমান। আপনার যেহেতু hasOneসম্পর্ক রয়েছে আমি এই emptyপদ্ধতিটি পরীক্ষা করতে ব্যবহার করব :

$model = RepairItem::find($id);
if (!empty($temp = $request->input('option'))) {
   $option = $model->option;

   if(empty($option)){
      $option = $model->option()->create();
   }

   $option->someAttribute = temp;
   $option->save();
};

তবে এটি অতিমাত্রায়। যদি সম্পর্ক বিদ্যমান চেক করতে নির্ধারণ করতে যদি আপনি একটি কি করা উচিত কোন প্রয়োজন নেই updateবা createকল। কেবল আপডেটআরক্রিয়েট পদ্ধতিটি ব্যবহার করুন । এটি উপরের সমতুল্য:

$model = RepairItem::find($id);
if (!empty($temp = $request->input('option'))) {  
   $model->option()
         ->updateOrCreate(['repair_item_id' => $model->id],
                          ['option' => $temp]);
}

0

গণনা ($ x) ফাংশনটির খারাপ ব্যবহারের কারণে আমি যখন আমার পিএইচপি সংস্করণটি 7.2+ এ আপডেট করেছি তখন আমার কোডটি পুরোপুরি রিফ্যাক্টর করতে হয়েছিল। এটি সত্যিকারের ব্যথা এবং এটি অত্যন্ত ভয়ঙ্কর কারণ এখানে শত শত ব্যবহার, বিভিন্ন পরিস্থিতিতে রয়েছে এবং কোনও নিয়মই সবথেকে ফিট করে না ..

নিয়মগুলি আমি প্রতিটি কিছুর প্রতিরোধক অনুসরণ করেছি, উদাহরণস্বরূপ:

$ x = আথ :: ব্যবহারকারী () -> পোস্ট-> সন্ধান (6); (ব্যবহারকারী -> সন্ধান () ব্যবহার করে কোনও আইডি = 6 আছে কিনা তা পরীক্ষা করে দেখুন)

[FAILS] if(count($x)) { return 'Found'; } 
[GOOD] if($x) { return 'Found'; }

$ x = আথ :: ব্যবহারকারী () -> প্রোফাইল-> বিভাগসমূহ; (প্রোফাইলে কিছু বিভাগ রয়েছে কিনা তা পরীক্ষা করে দেখুন)

[FAILS] if(count($x)) { return 'Found'; }
[GOOD] if($x->count()) { return 'Found'; }

$ x = আথ :: ব্যবহারকারী () -> প্রোফাইল-> পান (); (- - get () ব্যবহার করার পরে ব্যবহারকারীর প্রোফাইল আছে কিনা তা পরীক্ষা করুন)

[FAILS] if(count($x)) { return 'Found'; }
[GOOD] if($x->count()) { return 'Found'; }

আশা করা যায় এটি সাহায্য করতে পারে, প্রশ্ন জিজ্ঞাসার 5 বছর পরেও, এই স্ট্যাকওভারফ্লো পোস্টটি আমাকে অনেক সহায়তা করেছে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.