লারাভেল স্পষ্টত: কীভাবে যুক্ত টেবিলগুলি থেকে কেবলমাত্র নির্দিষ্ট কলামগুলি পাবেন


102

আমি স্পষ্টত থিম এবং ব্যবহারকারীদের 2 টি টেবিল পেয়েছি।

থিম মডেল:

public function user() {
  return $this->belongs_to('User');
}

ব্যবহারকারী মডেল:

public function themes() {
  return $this->has_many('Theme');
}

আমার সুস্পষ্ট এপিআই কলটি নীচের মত দেখাচ্ছে:

return Response::eloquent(Theme::with('user')->get());

যা থিম থেকে সমস্ত কলাম (ভাল এটি) থেকে এবং ব্যবহারকারীদের সমস্ত কলাম (ভাল নয়) প্রদান করে returns আমার কেবলমাত্র ব্যবহারকারীর মডেল থেকে 'ব্যবহারকারীর নাম' কলাম দরকার, আমি কীভাবে এই সন্ধানটি সীমাবদ্ধ রাখতে পারি?


আমি একই ধরণের কাজ করছি, আমি Responseকী ধরণের ক্লাসটি আমদানি করা দরকার তা ব্যবহার করে জানতে পারি?
অ্যাগনেস পলিট

উত্তর:


103

আপনি কোন কলামগুলি নির্বাচন করতে চান তা নির্দিষ্ট করতে আপনার মডেলটি পরিবর্তন করুন:

public function user() {
  return $this->belongs_to('User')->select(array('id', 'username'));
}

এবং আপনি যে কলামটিতে যোগ দিচ্ছেন তা অন্তর্ভুক্ত করতে ভুলবেন না।


6
দুর্দান্ত উত্তর, যোগদানের কলামটি অন্তর্ভুক্ত করার বিষয়ে টিপটি আমাকে অনেক সময় বাঁচিয়েছিল!
Greatwitenorth

যদি কিছু জায়গায় আমার আইডি এবং ব্যবহারকারীর নাম উভয়ের পরিবর্তে কেবল আইডি প্রয়োজন? এখনও দুজনকেই নির্বাচন করতে হবে?
দারিয়াস.ভি.আগস্ট

হাই কি নির্বাচিত ফাংশনটির মডেল ক্যোয়ার বিল্ডারে একই ফাংশন রয়েছে?
গকিগুকস

5
আমি এটি একটি ভাল পদ্ধতির মনে করি না। এটি কলামের নামগুলিতে কঠোরভাবে কোডিং করা হবে। সমস্ত জায়গাগুলি কেবল এই কলামগুলিতে ফিরে আসবে। অন্য কিছু এপিআই-তে আমার আরও কিছু কলামের প্রয়োজন হতে পারে, যাতে এখানে কাজ করবে না। আমি মনে করি কোয়েরি বিল্ডার ব্যবহার করা এখানে বিকল্প।
আমান সুরা

4
এটি একটি নাটকীয় পদ্ধতির কারণ এটি প্রতিবারই আপনি যখন কলটি এগিয়ে নিয়ে যাবেন তখনই তা ঘটবে। আমি বিশ্বাস করি সাজ্জাদ আশরাফের
উত্তরটিই

37

লারাভেল> = 5.2 এর জন্য

ব্যবহার করুন > প্লাক () - পদ্ধতি

$roles = DB::table('roles')->pluck('title');

আপনি যদি একটি একক কলামের মান সমেত একটি অ্যারের পুনরুদ্ধার করতে চান তবে আপনি প্লাক পদ্ধতিটি ব্যবহার করতে পারেন


লারাভেলের জন্য <= 5.1

ব্যবহার করুন -> তালিকা () পদ্ধতি

$roles = DB::table('roles')->lists('title');

এই পদ্ধতিটি ভূমিকা শিরোনামের একটি অ্যারে ফিরিয়ে দেবে। আপনি ফিরে আসা অ্যারের জন্য একটি কাস্টম কী কলামটিও নির্দিষ্ট করতে পারেন:


4
এটি আসলে প্রশ্নের উত্তর নয় (যা বিশেষত যোগ / সম্পর্ক সম্পর্কে ছিল)।

30

আপনি যেমন পান প্যারামিটারে ক্ষেত্রগুলির একটি অ্যারে সরবরাহ করতে পারেন:

return Response::eloquent(Theme::with('user')->get(array('user.username'));

আপডেট (লারাভেল 5.2 এর জন্য) ডক্স থেকে , আপনি এটি করতে পারেন:

$response = DB::table('themes')
    ->select('themes.*', 'users.username')
    ->join('users', 'users.id', '=', 'themes.user_id')
    ->get();

4
আমি এটি চেষ্টা করেছি এবং এটি একটি ত্রুটি দেখায় SQLSTATE[42S22]: Column not foundএবং এটি এসকিউএল এর মধ্যে টেবিলটি অন্তর্ভুক্ত করে না with। ত্রুটিতে প্রদর্শিত স্কেলটি হ'ল "SELECT fk_table.column1 FROM main_table"।
মিশেল আইরেস

4
এটি "users.username" ("User.username" নয়)। উত্তরের কোডটি যদি আপনার আসল ডাটাবেসের সাথে মেলে টেবিল এবং কলামের নামগুলি ব্যবহার করে তবে তা কাজ করবে। এটি এই সমাধানটির দিকনির্দেশক, এটি স্পষ্টত ব্যবহার না করে একটি এসকিউএল কোয়েরি তৈরি করছে, সুতরাং নামগুলি আপনার আসল ডাটাবেস টেবিল এবং কলামগুলির সাথে মেলে।
orrd


16

এইভাবেই আমি এটি করি

$posts = Post::with(['category' => function($query){
        $query->select('id', 'name');
      }])->get();

ব্যবহারকারী 2317976 এর প্রথম উত্তরটি আমার পক্ষে কাজ করে না, আমি লারাভেল 5.1 ব্যবহার করছি


4
আপ টু ডেট উত্তর = দরকারী!
thesunneversets

ধন্যবাদ এটা আমার জন্য ভালই কাজ করে। আপনার অবশ্যই 'আইডি' দিয়ে যেমন করেছেন তেমন সিলেক্ট স্টেটমেন্টে আমি অবশ্যই বিদেশী কী যুক্ত করব অন্যথায় এটি বাতিল হয়ে যায়।
ইমান সিদিঘি

তবে, এটি এখনও প্রতিটি ফলাফলের জন্য একটি "পিভট" ক্ষেত্রটি পুনরুদ্ধার করে, এতে দুটি আইডির (পোস্ট_আইডি এবং বিভাগ_আইডি) ঠিক আছে? আমি কীভাবে এটি চালাতে পারি?
মায়িড

4
@ মায়িড আপনি pivotপোস্ট মডেলের $ লুকানো অ্যারে যোগ করার চেষ্টা করতে পারেনprotected $hidden = ['pivot']
সাজ্জাদ আশরাফ

এটিই সেরা সমাধান (ধরে
নিচ্ছেন আপনি লারাভেলের

11

আরেকটি বিকল্প হ'ল $hiddenমডেলটিতে সম্পত্তিটি ব্যবহার করে আপনি যে কলামগুলি প্রদর্শন করতে চান তা আড়াল করতে পারেন। আপনি উড়ে এই সম্পত্তিটি সংজ্ঞায়িত করতে পারেন বা আপনার মডেলটিতে ডিফল্ট সেট করতে পারেন।

public static $hidden = array('password');

আপনি যখন JSON প্রতিক্রিয়া ফিরিয়ে দেবেন তখন এখন ব্যবহারকারীদের পাসওয়ার্ড লুকিয়ে থাকবে।

আপনি এটিকে একই পদ্ধতিতে ফ্লাইতে সেট করতে পারেন।

User::$hidden = array('password');

4
লারাভেল ৪.২-তে আমি এইটিকে গতিশীলভাবে সেট করার চেষ্টা করার সময় 'সুরক্ষিত সম্পত্তি ব্যবহারকারীর অ্যাক্সেস করতে পারি না: $ লুকানো'।
এমটিএমএকডোনাল্ড

4
এটা হওয়া উচিত নয় static
স্ট্যাক ওভারফ্লো

@ স্ট্যাকওভারফ্লোড, আমি এনেছি যে আপনি এই প্রশ্ন / উত্তরটি কতটা পুরানো এবং এটি লারাভেল ৩ এর সাথে সম্পর্কিত সে সম্পর্কে কোনও খেয়াল করেননি
জেসন লুইস

10

পৃষ্ঠাগুলি সহ ব্যবহার

$data = DB::table('themes')
->join('users', 'users.id', '=', 'themes.user_id')
->select('themes.*', 'users.username')
->paginate(6);

6

ব্যবহারকারী 2317976 সম্পর্কিত সারণির কলামগুলি নির্বাচন করার একটি দুর্দান্ত স্থিতিশীল উপায় চালু করেছে।

এখানে আমি একটি গতিশীল কৌশল পেয়েছি যাতে মডেলটি ব্যবহার করার সময় আপনি যা চান তা পেতে পারেন:

return Response::eloquent(Theme::with(array('user' => function ($q) {
    $q->addSelect(array('id','username'))
}))->get();

আমি স্রেফ পেয়েছি এই কৌশলটি লোড () এর সাথেও ভাল কাজ করে। এটি খুব সুবিধাজনক।

$queriedTheme->load(array('user'=>function($q){$q->addSelect(..)});

আপনি লক্ষ্য টেবিলের কীটিও অন্তর্ভুক্ত করেছেন তা নিশ্চিত করুন অন্যথায় এটি এটি সন্ধান করতে সক্ষম হবে না।


6

এই পথে:

Post::with(array('user'=>function($query){
    $query->select('id','username');
}))->get();

দয়া করে সর্বদা আপনার উত্তরটি ব্যাখ্যা করুন।
রোহিত গুপ্ত

একই সমস্যা ছিল, এটি এখন পর্যন্ত স্মার্টতম উপায়! এই উত্তর আন্ডাররেটেড হয়!
ওলব্লিজ

ইতোমধ্যে সাজ্জাদ আশরাফ যে উত্তরটি জমা দিয়েছিলেন তা হ'ল একই।
অরর্ড

5

আমি জানি যে এটি একটি পুরানো প্রশ্ন, তবে আপনি যদি কোনও এপিআই তৈরি করে থাকেন তবে প্রশ্নের লেখক যেমন করেন, এই জাতীয় কাজগুলি সম্পাদন করতে আউটপুট ট্রান্সফর্মার ব্যবহার করুন।

ট্রান্সফরমার আপনার প্রকৃত ডাটাবেস ক্যোয়ারী ফলাফল এবং একটি নিয়ামকের মধ্যে একটি স্তর। এটি কোনও ব্যবহারকারী বা কোনও এপিআই গ্রাহকের আউটপুট হতে চলেছে তা সহজেই নিয়ন্ত্রণ এবং সংশোধন করতে দেয়।

আমি আপনার আউটপুট রূপান্তর স্তরের শক্ত ভিত্তি হিসাবে ফ্র্যাকটালকে প্রস্তাব দিই । আপনি এখানে ডকুমেন্টেশন পড়তে পারেন ।



4

লারাভেল 5.5-তে, এটি করার সর্বোত্তম উপায় হ'ল:

Theme::with('user:userid,name,address')->get()

আপনি একটি কোলন এবং ক্ষেত্রগুলি যুক্ত করতে চান যা আপনি কমা দ্বারা পৃথক করে এবং তাদের মধ্যে কোনও স্থান ছাড়াই নির্বাচন করতে চান।


আপনি কী জানেন কীভাবে আমরা পৃষ্ঠাগুলি ব্যবহার করার সময় সম্পর্কিত সারণীর নির্দিষ্ট কলামটি আনতে পারি।
দানিয়াল নাসির

2

মডেল ব্যবহার:

Model::where('column','value')->get(['column1','column2','column3',...]);

অনুসন্ধান নির্মাতা ব্যবহার:

DB::table('table_name')->where('column','value')->get(['column1','column2','column3',...]);

0

যদি আমি ভাল করে বুঝতে পারি তবে যা ফিরিয়ে দেওয়া হয়েছে তা ঠিক আছে যদি আপনি কেবল একটি কলাম দেখতে না চান। যদি তাই হয় তবে নীচে এটি আরও সহজ হওয়া উচিত:

return Response::eloquent(Theme::with('user')->get(['username']));

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