লারাভেল সেভ / অনেকের সাথে অনেকের আপডেট করে


89

কীভাবে অনেকে আমাকে অনেক সম্পর্কের হাত থেকে বাঁচাতে সহায়তা করতে পারেন? আমার টাস্ক রয়েছে, ব্যবহারকারীর অনেক কাজ থাকতে পারে এবং টাস্কে অনেক ব্যবহারকারী থাকতে পারে (অনেক থেকে অনেক), আমি যা অর্জন করতে চাই তা হ'ল অ্যাডমিন আপডেট আপডেটে একাধিক ব্যবহারকারীকে নির্দিষ্ট টাস্কে নিয়োগ করতে পারে। এটি এইচটিএমএল একাধিক নির্বাচন ইনপুট মাধ্যমে করা হয়

name="taskParticipants[]"

এখানে ধরাটি হ'ল একই ফর্মের (ইনপুট) মাধ্যমে আপনি ব্যবহারকারীদের যুক্ত / অপসারণ করতে পারেন, এজন্য আমাকে সিঙ্ক ব্যবহার করতে হবে ()। হয়তো আমার শুরু থেকেই শুরু করা উচিত তবে কোথায় শুরু করব তা আমি জানি না ...

এটি আমার ব্যবহারকারীর মডেল:

public function tasks()
{
    return $this->belongsToMany('Task','user_tasks');
}

টাস্ক মডেল

public function taskParticipants()
{
    return $this->belongsToMany('User','user_tasks');
}

টাস্ক নিয়ন্ত্রণকারী

public function update($task_id)
{
    if (Input::has('taskParticipants'))
    {
        foreach(Input::get('taskParticipants') as $worker)
        {
            $task2 = $task->taskParticipants->toArray();
            $task2 = array_add($task2,$task_id,$worker);
            $task->taskParticipants()->sync(array($task2));
        }
    }
}

এটি টেবিল টাস্কগুলির কাঠামো আইডি | শিরোনাম | সময়সীমা

user_tasks
id|task_id|user_id

আমি আমার কোড আপডেট করেছি। লিঙ্ক
সুপারম্যানএসএল

4
$workers = Input::get('taskParticipants'); $task->taskParticipants()->sync($workers);এবং যতক্ষণ না আপনি সেই ফর্মটি থেকে সমস্ত ব্যবহারকারীকে কার্যভার হিসাবে নির্ধারিত হন ততক্ষণ আপনার প্রয়োজন।
জেরেক টাকাসেক

@ জারেকটাকাজিক ধন্যবাদ, এটি যাদু ছিল।
রিউ_হায়াবুসার

উত্তর:


200

tldr; sync২ য় পরম দিয়ে ব্যবহার করুনfalse


বহু-থেকে-বহু সম্পর্ক belongsToManyউভয় মডেলটিতে রয়েছে:

// Task model
public function users()
{
  return $this->belongsToMany('User', 'user_tasks'); // assuming user_id and task_id as fk
}

// User model
public function tasks()
{
  return $this->belongsToMany('Task', 'user_tasks');
}

যাতে নতুন সম্পর্ক ব্যবহার করতে attachবা sync

উভয়ের মধ্যে পার্থক্য হ'ল:

1 attach এটি ইতিমধ্যে আছে কিনা তা পরীক্ষা না করে পিভট টেবিলটিতে নতুন সারি যুক্ত করবে। আপনার যখন সেই সম্পর্কের সাথে অতিরিক্ত ডেটা যুক্ত থাকে তখন এটি ভাল example

Userএবং Examপিভট টেবিলের সাথে সংযুক্তattempts: id, user_id, exam_id, score

আমি মনে করি আপনার পরিস্থিতিতে এটির প্রয়োজন নেই:

$user->tasks()->getRelatedIds(); // [1,2,3,4,5,6]

$user->tasks()->attach([5,6,7]);
// then
$user->tasks()->getRelatedIds(); // [1,2,3,4,5,6,5,6,7]

2 sync অন্যদিকে, হয় সমস্ত সম্পর্ক সরিয়ে ফেলবে এবং নতুনভাবে সেট আপ করবে:

$user->tasks()->getRelatedIds(); // [1,2,3,4,5,6]

$user->tasks()->sync([1,2,3]);
// then
$user->tasks()->getRelatedIds(); // [1,2,3]

অথবা এটি পূর্ববর্তী এবং ডুপ্লিকেটগুলি যুক্ত না করে ডিটেক্ট না করে নতুন সম্পর্ক স্থাপন করবে:

$user->tasks()->sync([5,6,7,8], false); // 2nd param = detach
// then
$user->tasks()->getRelatedIds(); // [1,2,3,4,5,6,7,8]

8
এপিআই ডক্সের চেয়ে মূল ডক্সে যদি এটি নথিভুক্ত করা হত তবে ভাল লাগবে! মন মাতান. +1
ceejayoz

আমি সিঙ্ক এবং দ্বিতীয় প্যারামিটার সহ দ্বিতীয় সমাধানটি সত্যিই পছন্দ করি। আমি মন্তব্য বেলোতে যেমন বলেছি, আমি বিচ্ছিন্ন ব্যবহার না করার সামর্থ্য রাখি না। গল্পটি হ'ল অ্যাডমিন ব্যবহারকারীদের জন্য কার্য নির্ধারণ করতে পারে। তিনি ড্রপডাউন (একাধিক) থেকে ব্যবহারকারীদের নির্বাচন করুন, ক্ষেত্রটি অংশগ্রহণকারী []। সুতরাং ...: পদক্ষেপ 1: অ্যাডমিন তিনজন ব্যবহারকারীকে টাস্ক বরাদ্দ করে (আপনার পদ্ধতিটি কাজ করে, আমাদের ডিবিতে 3 টি রেকর্ড রয়েছে) পদক্ষেপ 2: অ্যাডমিন টাস্ক এ আপডেট করে এবং দুটি ব্যবহারকারী যুক্ত করে (আপনার পদ্ধতিটি কাজ করে, আমাদের ডিবিতে 5 টি রেকর্ড রয়েছে) পদক্ষেপ 3: অ্যাডমিন টাস্ক এ আপডেট করে এবং 1
জনকে

4
আপনি $this->belongsToMany('User')যদি নিজের সারণির নাম বর্ণানুক্রমিকভাবে এবং একক (তবে task_userপরিবর্তে user_tasks) ব্যবহার করেন তবে আপনার সম্পর্ক জিজ্ঞাসাটি সহজ করতে পারবেন
কুশা

@ রোক যদি আপনি সর্বদা সম্পর্কিত সমস্ত ব্যবহারকারীদের একটি অ্যারে পাস করেন তবে ডিটচিংয়ের সাথে ব্যবহার করুন sync, কোনও উদ্বেগ নেই। আমি যখনই idসম্পর্কিত মডেলটির কোনও একক পাস করি তখন আপনি 'ব্যবহারকারীর জন্য নতুন টাস্ক যুক্ত করতে' বা 'কোনও ব্যবহারকারীর জন্য একটি কার্যভার নির্ধারণ করুন' চাইলে মিথ্যাতে 2 য় প্যারাম সেট ব্যবহার করার পরামর্শ দিই ।
জারেক টাকাসেক

4
@FabioAntunes syncসহ একটি বিন্যাস দেখায় detached, attachedএবং updatedতালিকা। attachকিছু ফেরত দেয় না, তবে উভয় ক্ষেত্রেই ডিবি কলগুলিতে অপ্রত্যাশিত কিছু হ্যান্ডেন্ড হলে আপনি ব্যতিক্রম পাবেন।
জারেক টাকাকজেক

109

সমস্ত স্বতন্ত্র সম্পর্কগুলি কীভাবে সংরক্ষণ এবং আপডেট করবেন সে সম্পর্কে আমার নোটগুলি এখানে।

মধ্যে এক এক :

আপনি ব্যবহার করতে হবে HasOne প্রথম মডেল এবং এর BelongsTo দ্বিতীয় মডেলের উপর

প্রথম মডেলটিতে রেকর্ড যুক্ত করতে ( হাসন ) সেভ  ফাংশনটি ব্যবহার করুন

উদাহরণ:    $post->comments()->save($comment);

দ্বিতীয় মডেলটিতে রেকর্ড যুক্ত করতে ( বেলংসটো ) সহযোগী ফাংশনটি ব্যবহার করুন 

উদাহরণ:    $user->account()->associate($account);    $user->save();


মধ্যে অনেকের কাছে এক :

আপনি ব্যবহার করতে হবে HasMany প্রথম মডেল এবং এর BelongsTo দ্বিতীয় মডেলের উপর

প্রথম টেবিলে রেকর্ড যুক্ত করতে ( হাসম্যানি ) সেভ  বা সেভম্যানি ফাংশন ব্যবহার করুন

উদাহরণ:    $post->comments()->saveMany($comments);

দ্বিতীয় মডেলটিতে রেকর্ড যুক্ত করতে ( বেলংসটো ) সহযোগী ফাংশনটি ব্যবহার করুন 

উদাহরণ:    $user->account()->associate($account);    $user->save();


অনেকের মধ্যে অনেকের মধ্যে :

আপনাকে প্রথম মডেলটিতে বেলঙ্গস টোমনি এবং দ্বিতীয় মডেলটিতে বেলঙ্গস টোমনি ব্যবহার করতে হবে 

পিভট টেবিলটিতে রেকর্ড যুক্ত করতে ফাংশন সংযুক্তি বা সিঙ্ক ব্যবহার করুন

  • উভয় ফাংশনই একক আইডি বা আইডির অ্যারে গ্রহণ করে 

  • পার্থক্যটি চেকগুলি সংযুক্ত করে যদি ইতিমধ্যে সিঙ্ক না করে পিভট টেবিলটিতে রেকর্ডটি উপস্থিত থাকে

উদাহরণ: $user->roles()->attach($roleId);


মধ্যে অনেকের কাছে বহুরুপী ওয়ান :

আপনাকে প্রধান মডেলটিতে  মরফম্যান এবং সমস্ত (*** সক্ষম) মডেলগুলিতে মরফটো ব্যবহার  করতে হবে

অন্যান্য সমস্ত মডেলের রেকর্ড যুক্ত করতে সেভটি ব্যবহার  করুন

উদাহরণ:    $course->tags()->save($tag);

পিভট টেবিলটিতে নিম্নলিখিত কলামগুলি থাকা উচিত:

। প্রধান মডেল আইডি

। (*** সক্ষম) আইডি

। (*** সক্ষম) টাইপ করুন


মধ্যে বহুরুপী অনেক অনেক :

আপনাকে প্রধান মডেলটিতে  মরফবিম্যানি এবং সমস্ত (*** সক্ষম) মডেলগুলিতে মরফটোম্যানি ব্যবহার  করতে হবে

অন্যান্য সমস্ত মডেলের রেকর্ড যুক্ত করতে সেভ বা সেভম্যানি ব্যবহার করুন

উদাহরণ:    $course->tags()->save($tag);

উদাহরণ:    $course->tags()->saveMany([$tag_1, $tag_2, $tag_3]);

পিভট টেবিলটিতে নিম্নলিখিত কলামগুলি থাকা উচিত:

। প্রধান মডেল আইডি

। (*** সক্ষম) আইডি

। (*** সক্ষম) টাইপ করুন


ইন হ্যাজ মিন মথ থ্রু (শর্টকাট):

আপনাকে প্রথম টেবিলে হাসম্যানিথ্রু ব্যবহার করতে হবে এবং অন্যান্য 2 টেবিলের সাথে স্বাভাবিক সম্পর্ক রাখতে হবে

এটি মুনিটোম্যান সম্পর্কের জন্য কাজ করে না (যেখানে একটি পাইভোট টেবিল রয়েছে)

তবে এটির জন্য একটি দুর্দান্ত এবং সহজ সমাধান রয়েছে।


এই উত্তরটি দ্বারা অনুপ্রাণিত হয়ে আমি এখানে একটি নিবন্ধ লিখেছি। এটি যাচাই করা গুরুত্বপূর্ণ: https://hackernoon.com/eloquent-referencesship-cheat-sheet-5155498c209


আমি ইতিমধ্যে এই উত্তরটি রেখেছিলাম যখন তাদের ইতিমধ্যে সঠিক উত্তরে ৪০ টিরও বেশি পছন্দ রয়েছে তবে হ্যাঁ আমি জানি এটি আমার পক্ষে কতটা কার্যকর, আপনি এটি পছন্দ করেছেন বলে আনন্দিত :)
মাহমুদ জাল্ট

4
আমি আপনাকে জানাতে চাই যে আপনি একজন ত্রাণকর্তা
Chay22

4
এটি একটি দুর্দান্ত উত্তর।
ক্যারো

4
কিভাবে সম্পর্ক আপ এক আপডেট করতে। আপনি কীভাবে যুক্ত করবেন তা ব্যাখ্যা করেছেন। আপনি দয়া করে আপডেট ব্যাখ্যা করতে পারেন? এমন কিছুর মতো রেকর্ড আপডেট করার কোনও পদ্ধতি আছে updateMany? ধন্যবাদ
হামিদ্রেজা

4

syncWithoutDetaching([$id_one, $id_two, $id_three]);আপনি যা খুঁজছেন তা আসলে এটি [ sync২ য় প্যারামের সাথে false] ঠিক কাজটি করে!


0

syncফাংশন থেকে প্রস্থান সম্পর্ক obliterates এবং আপনার অ্যারের সম্পর্কের সমগ্র তালিকা করে তোলে। attachপরিবর্তে আপনি অন্যকে সরিয়ে না রেখে সম্পর্ক যুক্ত করতে চান ।


আমি সংযুক্তিটি ব্যবহার করতে পারি না কারণ আমি আপডেট কোডের অভ্যন্তরে এই কোডটি ব্যবহার করছি। গল্পটি হ'ল অ্যাডমিন টাস্ক আপডেট করতে এবং ইনপুট অংশগ্রহণকারীদের [] যাতে কার্যক্রমে অংশ নেবে তাদের সাথে পূরণ করতে পারে। সুতরাং আমার এটি পরীক্ষা করে দেখতে হবে এবং এটি মুছে ফেলতে হবে (বা নতুন রেকর্ড যুক্ত করার জন্য নয়) বা এটি উপস্থিত না থাকলে এটি যুক্ত করুন।
সুপারম্যানএসএল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.