কীভাবে লারাভেল ইলিউভেন্ট ক্যোয়ারিতে (বা ক্যোয়ারী বিল্ডার ব্যবহার করে) কোনও টেবিলের নাম রাখবেন?


147

বলুন আমরা লারাভেলের কোয়েরি বিল্ডারটি ব্যবহার করছি:

$users = DB::table('really_long_table_name')
           ->select('really_long_table_name.id')
           ->get();

আমি এই এসকিউএল এর সমতুল্য খুঁজছি:

really_long_table_name AS short_name

এটি বিশেষত সহায়ক হবে যখন আমাকে প্রচুর নির্বাচন এবং চক্রগুলি টাইপ করতে হবে (বা সাধারণত আমি নির্বাচিতের কলামের উপাধিতেও উপনামটি অন্তর্ভুক্ত করি এবং এটি ফলাফলের অ্যারেতে ব্যবহৃত হয়)। কোনও টেবিল এলিয়াস ছাড়া আমার জন্য আরও অনেক বেশি টাইপিং রয়েছে এবং সবকিছুই খুব কম পঠনযোগ্য হয়ে যায়। উত্তরটি লারাভেল ডক্সে খুঁজে পাচ্ছেন না, কোনও ধারণা?

উত্তর:


218

লারাভেল টেবিল এবং কলামগুলির সাথে উপকরণগুলি সমর্থন করে AS। চেষ্টা

$users = DB::table('really_long_table_name AS t')
           ->select('t.id AS uid')
           ->get();

আসুন এটি একটি দুর্দান্ত tinkerসরঞ্জামের সাথে ক্রিয়াতে দেখি see

$ পিএইচপি কারিগর টিঙ্কার
[1]> স্কিমা :: তৈরি করুন ('সত্যিকারের_লং_সামগ্রী_নাম', ফাংশন ($ টেবিল) $ $ টেবিল-> ইনক্রিমেন্ট ('আইডি');});
// খালি
[2]> ডিবি :: টেবিল ('সত্যিকারের_লম্বা_ টেবিল_নাম') -> sertোকান (['আইডি' => নাল]);
// সত্য
[3]> ডিবি :: টেবিল ('সত্যিই_লং_ টেবিল_নাম এএস টি') -> নির্বাচন করুন ('t.id as uid') -> পান ();
// অ্যারে (
// 0 => অবজেক্ট (stdClass) (
// 'uid' => '1'
//)
//)

2
@ রুবেেন্সমারিজুও আমি জানি আমি বিশ্বাস করি আপনি লারাভেল
পিটার্মে

2
নিবন্ধন সক্রিয় রেকর্ডের অর্থ এক টেবিলের জন্য ব্যবহার করা হয় তাই আপনার উপাধিকার প্রয়োজন নেই। আপনি যখন সম্পর্কগুলি ব্যবহার করেন আপনি তখনও একবারে একটি টেবিলের সাথে লেনদেন করেন (যেমন আপনি সম্পর্কের ক্ষেত্রে ফিল্টারগুলি সংজ্ঞায়িত করেন)। এখন আপনি যদি কোলারি বিল্ডারকে কোনও স্পষ্ট মডেল (অর্থাত্ যোগ দিন) দিয়ে ব্যবহার করছেন তবে আপনি সমস্ত যুক্ত টেবিলগুলিতে এলিয়াস ব্যবহার করতে পারেন, তবে মডেল টেবিলটি।
পিটার্ম

1
@ পেটারম যদি আমি স্পষ্টতভাবে ক্যোয়ারী বিল্ডার ব্যবহার করি? আমার অর্থ ছদ্মবেশী মডেলটির টেবিলের নামের জন্য একটি সুরক্ষিত সম্পত্তি ঘোষণা করা দরকার (উদাঃ protected $table = "books";) তবে আমি কীভাবে একটি উপকরণ করব? (উদাঃ ... FROM books AS A ...
বর্ধিত স্কয়ার

আপনি করতে পারেন protected $table = 'really_long_table_name AS short_name';তবে এটি INSERTs এ ব্যর্থ হত। সম্পর্কের প্রশ্ন ভাঙতে পারে। পুরোপুরি স্পষ্টভাবে এড়াতে আমি লুয়েন এবং একটি ডিডিডি / সংগ্রহস্থল প্যাটার্ন ব্যবহার করছি।
এগ্রোহামার

@ প্রিয় আমিও ইলিউভেন্ট ওরফে আটকে রয়েছি। আপনি কি স্পষ্ট ভাষায় কিছু খুঁজে পেয়েছেন?
লিজেশ শাক্য

77

সুস্পষ্ট মডেলগুলিতে এলিয়াস ব্যবহার করার জন্য আপনার কোডটি এভাবে পরিবর্তন করুন:

Item
    ::from( 'items as items_alias' )
    ->join( 'attachments as att', DB::raw( 'att.item_id' ), '=', DB::raw( 'items_alias.id' ) )
    ->select( DB::raw( 'items_alias.*' ) )
    ->get();

এটি স্বয়ংক্রিয়ভাবে টেবিলের নামগুলিতে সারণি উপসর্গ যুক্ত করবে এবং Itemsমডেলের একটি উদাহরণ প্রদান করবে । খালি কোয়েরির ফলাফল নয়। যোগ করা DB::rawলারাভেলকে উপাধিতে টেবিলের উপসর্গ যুক্ত করা থেকে বাধা দেয়।


1
@ m3rg আপনি কি কখনও নরম মোছা দিয়ে কাজ করার কোনও উপায় খুঁজে পেয়েছেন? অনুসন্ধানে ত্রুটি ব্যর্থ হয়েছেUnknown column 'table_alias.deleted_at'
dev7

কিভাবে এই পরিস্থিতি সম্পর্কে? B.bank_id = a.id এবং a.agent_type = 2 যেখানে B.status = 1 এবং b.group = -1 এ একটি নিখুঁত বাহিরে যোগ দিন fx_ex_keys হিসাবে * নির্বাচন করুন;
জিএফএক্সজামাল

@jRhesk ব্যবহার করুন ডিবি :: টেবিলের উপকরণগুলি লক্ষ্য করতে সর্বত্র কাঁচা। অন্যান্য
লারাভেল

@ এম 3 আরজি @ ইয়ানি আমি এটি ব্যবহার করি ->withTrashed()এবং->whereNull('table_alias.deleted_at')
ফিরমান হিদায়াত ২ '

8

এটি কীভাবে করা যায় তা এখানে। আমি যোগদানের সাথে একটি উদাহরণ দেব যাতে এটি কারও কাছে সুস্পষ্ট হয়ে যায়।

$products = DB::table('products AS pr')
        ->leftJoin('product_families AS pf', 'pf.id', '=', 'pr.product_family_id')
        ->select('pr.id as id', 'pf.name as product_family_name', 'pf.id as product_family_id')
        ->orderBy('pr.id', 'desc')
        ->get();

আশাকরি এটা সাহায্য করবে.


আন্ডারস্কোর (_) এর পরিবর্তে উলামের সাদা স্থান রয়েছে এমন একটি উদাহরণ আপনি সরবরাহ করতে পারেন?
চান্নক্স

7

স্পষ্টত ব্যবহার করতে। আপনার মডেলের উপরে যুক্ত করুন

protected $table = 'table_name as alias'

// টেবিলের নামটি আপনার ডাটাবেসের মতোই হওয়া উচিত

..তখন আপনার ক্যোয়ারিতে ব্যবহার করুন

ModelName::query()->select(alias.id, alias.name)


1
লারাভেল সুস্পষ্টভাবে খুব খারাপ ডিজাইন, ওরফে আপনি অপারেশন ক্যোয়ারির জন্য জরিমানার উপরে নির্ধারণ করেছেন, তবে আপডেট এবং মুছলে ত্রুটি ঘটবে কারণ আপনার নাম।
মিজ

1

আপনি এই লিখতে কম কোড ব্যবহার করতে পারেন:

    $users = DB::table('really_long_table_name')
       ->get(array('really_long_table_name.field_very_long_name as short_name'));

এবং অবশ্যই যদি আপনি আরও ক্ষেত্র নির্বাচন করতে চান তবে কেবল একটি "," লিখুন এবং আরও যুক্ত করুন:

 $users = DB::table('really_long_table_name')
       ->get(array('really_long_table_name.field_very_long_name as short_name', 'really_long_table_name.another_field as other', 'and_another'));

আপনি জটিল ক্যোয়ারিতে যোগদান করলে এটি অত্যন্ত ব্যবহারিক


0

এএমআইবি উত্তর হিসাবে একই, নরম মোছা ত্রুটির জন্য "অজানা কলাম 'টেবিল_লিয়াস.ডিলেটেড_এটি'", কেবল যুক্ত করুন ->withTrashed()তারপর এটি নিজের মতো পরিচালনা করুন->whereRaw('items_alias.deleted_at IS NULL')

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